Python 多处理:将文件句柄传递给进程
我的程序生成多个进程来进行一些耗时的计算。然后将结果收集到队列中,编写器进程将其写入输出文件 下面是我的代码的简化版本,可以说明我的问题。如果我在Python 多处理:将文件句柄传递给进程,python,multiprocessing,Python,Multiprocessing,我的程序生成多个进程来进行一些耗时的计算。然后将结果收集到队列中,编写器进程将其写入输出文件 下面是我的代码的简化版本,可以说明我的问题。如果我在Writer类中注释掉flush语句,test.out在程序结束时为空 这里到底发生了什么?test.out是否未正确关闭?假设将文件句柄传递给自治进程应该首先起作用,这是天真的吗 from multiprocessing import JoinableQueue, Process def main(): queue = JoinableQu
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()
作者是一个独立的过程。它写入文件的数据可能会被缓冲,因为进程一直在运行,它不知道应该刷新缓冲区(将其写入文件)。手动冲洗是正确的做法 通常,当您退出with块时,文件将被关闭,这将刷新缓冲区。但是父进程对其子进程的缓冲区一无所知,因此子进程必须刷新它自己的缓冲区(关闭文件也应该起作用——这不会关闭父进程的文件,至少在Unix系统上是这样)
另外,请从multiprocessing()中查看Pool类-这可能会为您节省一些工作 我没有使用python3,但是当我取消注释
self.handle.flush()
并使用self.handle.write(msg)
而不是print(msg,file=self.handle)
时,您的代码可以正常工作。