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)
时,您的代码可以正常工作。