用于单个输出文件(CSV)的Python多处理



我正在寻找Python中MultiProcessing的一些好的示例代码,这些代码将采用一个大数组(分为同一主数组的不同部分(来加快后续输出文件的处理。我注意到还有其他一些东西,比如Lock((函数,可以确保它以特定的顺序返回,但这并不是一个很好的例子,说明如何在运行作业时返回结果数组,这样我就可以以正确的时间序列顺序输出一个CSV文件。

以下是到目前为止我一直在处理的队列。如何分配q1.get((的结果或其他结果以便稍后重新组合?当我尝试用temp=q1.get((分配它时,它只是旋转……很好的例子是拆分一个数组,将其发送到多个进程,然后重新组合调用的函数的结果。我使用的是Python 3.7和Windows 10。

import time
import multiprocessing
from multiprocessing import Process, Queue
def f1(q, testArray):
testArray2 = [[41, None, 'help'], [42, None, 'help'], [43, None, 'help']]
testArray =  testArray + testArray2
q.put(testArray)
def f2(q, testArray):
#testArray.append([43, None, 'goodbye'])
testArray =  testArray + ([44, None, 'goodbye'])
q.put(testArray)
return testArray
if __name__ == '__main__':
print("Number of cpu : ", multiprocessing.cpu_count())
testArray1 = [1]
testArray2 = [2]
q1 = Queue()
q2 = Queue()
p1 = multiprocessing.Process(target=f1, args=(q1, testArray1,))
p2 = multiprocessing.Process(target=f2, args=(q2, testArray2,))
p1.start()
p2.start()   
print(q1.get())      # prints whatever you set in function above
print(q2.get())      # prints whatever you set in function above

print(testArray1)
print(testArray2)
p1.join()
p2.join()

我相信所有进程只需要一个队列。队列是为进程间通信而设计的。

对于排序,您可以传入进程id,并在连接结果后根据该id进行排序。或者,您可以尝试使用furas建议的多处理池。

这听起来是一个更好的方法。工人池通常会预先分配一个工人池,然后在该池上运行一组作业。这更有效,因为进程/线程是在初始设置的,并可用于作业。在您的实施过程中,流程是按作业/功能创建的,这取决于您处理的数据量,成本很高。

最新更新