我正在开发python 2.7
程序,使用multiprocessing
并行执行这些操作:
file 1
和file 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()
的结果填充此队列。 现在,我的问题是,当我运行此脚本时,它立即变为僵尸进程。我知道该函数有效,因为没有多处理实现我得到了我想要的结果。
我想从两个文件中读取并同时写入输出,以避免从我的输入文件生成一个巨大的列表然后读取它(输入文件很大)。你看到任何严重,完全错误或可以改进的东西吗?
答案 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)
我不想写很多关于所有这些的信息,只是想给你一些想法。如果您想了解更多关于某事的细节,请告诉我。希望它有所帮助!