1

Python ファイルmyfile.pyにスレッド + キューを正常に実装しました。ここで、このファイルをデーモンとして実行する必要があります。これは、すべてのスレッドがタスクを完了したら、キューを再設定して、スレッドを新しいタスクで動作させたいからです。ここでいくつかのコードを試していますが、プログラムが正しく応答しません:

# myfile.py

threadList = list()
i = 0
while i < 10:
    i += 1
    threadName = "T" + str(i)
    threadList.append(threadName)

#create queue
myQueue = Queue.Queue();

# create thread objects
threads = list()
for threadName in threadList:
    thread = WorkerThread(threadName, myQueue)
    thread.start()
    threads.append(thread)

def hello():    
    while True:
        logger.debug("true")
        if myQueue.empty():
            logger.debug("empty")
        else:
            logger.debug("not empty")

def run():
    daemon_context = daemon.DaemonContext(files_preserve=[handler.stream],
                                          stdout = open("./stdout.log","wb"),
                                          stderr = open("./stderr.log","wb"))
    with daemon_context:
        hello()

if __name__ == "__main__":
    run()

スクリプトが実行されると、「true」が出力され、そこで停止します。「空」または「空ではない」は記録されません。端末にも stderr.log にもエラーは表示されません。ただし、の条件チェックを削除するmyQueue.empty()と、デーモンは引き続き「true」を出力します。キューがデーモンで機能しないのはなぜですか?

4

1 に答える 1

1

os.fork()内部で実行しているデーモン化の前に一連のコードを実行しているため、この奇妙な動作が発生していると思われます。これにより、コードの一部が 1 つのプロセスで開始されるという奇妙な状態になりますが、その後、フォーク (新しいプロセスを取得することを意味します) し、フォークの前に作成したオブジェクトを使用しようとし始めますが、これは正しく機能しません。 . たとえば、実行中のスレッドはすべて強制終了されます。作業を開始するには、すべてのコードをwith daemon_contextブロック内に移動する必要があります。

ただし、これには注意が必要です。while Trueそのループでかなりの量を急速にディスクに書き込んでいます。

于 2014-07-27T17:25:13.887 に答える