多处理:将文件句柄传递给Process

时间:2015-03-23 07:50:54

标签: python multiprocessing

我的程序会产生多个进程来进行一些耗时的计算。然后将结果收集到队列中,编写器进程将它们写入输出文件。

下面是我的代码的简化版本,它应该说明我的问题。如果我在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()

1 个答案:

答案 0 :(得分:2)

作者是一个独立的过程。它写入文件的数据可能是缓冲的,并且因为进程一直在运行,所以它不知道它应该刷新缓冲区(将其写入文件)。手动冲洗是正确的做法。

通常,退出with块时文件将被关闭,这将刷新缓冲区。但是父进程对其子缓冲区一无所知,所以孩子必须刷新它自己的缓冲区(关闭文件也应该工作 - 不关闭父文件,至少在Unix系统上)。

另外,从多处理(https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing.pool)中查看Pool类 - 它可能会为您节省一些工作。