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()内部进行的。这让您处于一种奇怪的状态,您的一些代码在一个进程中开始,但随后您分叉(意味着您获得了一个新进程)并开始尝试使用您在分叉之前创建的那些对象,这将无法正常工作. 例如,所有正在运行的线程都会被杀死。您需要将所有代码移到with daemon_context块内才能开始工作。

不过,我会小心的。while True您正在使用该循环快速向磁盘写入相当多的内容。

于 2014-07-27T17:25:13.887 回答