我的程序会产生多个进程来进行一些耗时的计算。然后将结果收集到队列中,编写器进程将它们写入输出文件。
下面是我的代码的简化版本,它应该说明我的问题。如果我在Writer
类中注释掉flush语句,则test.out
在程序结束时为空。
这到底发生了什么? test.out
未正确关闭吗?假设将文件句柄传递给自治进程应该首先起作用,这是天真的吗?
from multiprocessing import JoinableQueue, Process
def main():
queue = JoinableQueue()
queue.put("hello world!")
with open("test.out", "w") as outhandle:
wproc = Writer(queue, outhandle)
wproc.start()
queue.join()
with open("test.out") as handle:
for line in handle:
print(line.strip())
class Writer(Process):
def __init__(self, queue, handle):
Process.__init__(self)
self.daemon = True
self.queue = queue
self.handle = handle
def run(self):
while True:
msg = self.queue.get()
print(msg, file=self.handle)
#self.handle.flush()
self.queue.task_done()
if __name__ == '__main__':
main()
答案 0 :(得分:2)
作者是一个独立的过程。它写入文件的数据可能是缓冲的,并且因为进程一直在运行,所以它不知道它应该刷新缓冲区(将其写入文件)。手动冲洗是正确的做法。
通常,退出with块时文件将被关闭,这将刷新缓冲区。但是父进程对其子缓冲区一无所知,所以孩子必须刷新它自己的缓冲区(关闭文件也应该工作 - 不关闭父文件,至少在Unix系统上)。
另外,从多处理(https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing.pool)中查看Pool类 - 它可能会为您节省一些工作。