如何同时从multiprocessing.Queue()中放入()和get()?

时间:2017-10-10 17:35:17

标签: python python-2.7 parallel-processing queue multiprocessing

我正在开发python 2.7程序,使用multiprocessing并行执行这些操作:

  • 同时从file 1file 2读取一行
  • 适用function(line_1, line_2)
  • 将函数输出写入文件

我是多处理的新手,一般来说我对python并不是非常专业。因此,我阅读了很多已经提出的问题和教程:我觉得很接近,但我现在可能遗漏了一些我无法发现的东西。

代码的结构如下:

from itertools import izip
from multiprocessing import Queue, Process, Lock

nthreads = int(mp.cpu_count())
outq = Queue(nthreads)
l = Lock()

def func(record_1, record_2):
     result = # do stuff
     outq.put(result)

OUT = open("outputfile.txt", "w")
IN1 = open("infile_1.txt", "r")
IN2 = open("infile_2.txt", "r")

processes = []
for record_1, record_2 in izip(IN1, IN2):
     proc = Process(target=func, args=(record_1, record_2))
     processes.append(proc)
     proc.start()

for proc in processes:
     proc.join()

while (not outq.empty()):
     l.acquire()
     item = outq.get()
     OUT.write(item)
     l.release()

OUT.close()
IN1.close()
IN2.close()

据我所知(目前为止)多处理作为包,我正在做的是:

  • 为函数结果创建一个队列,该队列的大小限制与计算机的核心数相兼容。
  • 使用func()的结果填充此队列。
  • 读取队列项,直到队列为空,将它们写入输出文件。

现在,我的问题是,当我运行此脚本时,它立即变为僵尸进程。我知道该函数有效,因为没有多处理实现我得到了我想要的结果。

我想从两个文件中读取并同时写入输出,以避免从我的输入文件生成一个巨大的列表然后读取它(输入文件很大)。你看到任何严重,完全错误或可以改进的东西吗?

1 个答案:

答案 0 :(得分:1)

我看到的最大问题是您应该通过流程传递队列对象,而不是尝试将其用作函数中的全局。

def func(record_1, record_2, queue):
     result = # do stuff
     queue.put(result)

for record_1, record_2 in izip(IN1, IN2):
     proc = Process(target=func, args=(record_1, record_2, outq))

此外,正如当前所写,您仍然会将所有信息提取到内存(也就是队列)中,并在写入输出文件之前等待读取完成。您需要移动p.join循环,直到读完队列,而不是将所有信息放在func末尾的队列中,它应该用循环中的chuck填充队列时间,或者它只是将它全部读入内存。

除非您在工作人员函数func中使用它,否则您也不需要锁定,如果您这样做,您将再次想要通过它。

如果你不想在内存中读取/存储很多东西,我会在迭代输入文件的同时写出来。这是将每行文件组合在一起的基本示例。

with open("infile_1.txt") as infile1, open("infile_2.txt") as infile2, open("out", "w") as outfile:
    for line1, line2 in zip(infile1, infile2):
        outfile.write(line1 + line2)

我不想写很多关于所有这些的信息,只是想给你一些想法。如果您想了解更多关于某事的细节,请告诉我。希望它有所帮助!