我很难在python的多处理过程中绕过两件事。我研究过这些文档,但仍然不明白:
n-loop
启动和加入流程(非重复代码,不知道我是否需要在Process
循环中执行任何特殊操作)目的:分解一个巨大的列表并分别运行每个块以获得更快的运行时间。
queue = Queue()
def filter(aBigList, startV, endV, startP, endPr, minV):
chunks = list(split(aBigList, 6))
p1 = Process(target=func1, args=(chunks[0], startP, endPr))
p2 = Process(target=func1, args=(chunks[1], startP, endPr))
p3 = Process(target=func1, args=(chunks[2], startP, endPr))
p4 = Process(target=func1, args=(chunks[3], startP, endPr))
p5 = Process(target=func1, args=(chunks[4], startP, endPr))
p6 = Process(target=func1, args=(chunks[5], startP, endPr))
p1.start()
p2.start()
p3.start()
p4.start()
p5.start()
p6.start()
#wait for all processes to finish
p1.join()
p2.join()
p3.join()
p4.join()
p5.join()
p6.join()
print(queue)
def func1(subList, startP, endPr):
for i in subList:
price = ind.getPrice(i) #returns a price of argument element
if startP <= float(price) <= endPr:
print("added")
queue.put(i)
答案 0 :(得分:2)
python multiprocessing
标准库为此用例提供nice class that can be very helpful:multiprocessing.Pool
。它将为您管理一些工作人员,您只需根据需要发送工作单元即可完成。这是您的代码,适合使用池而不是手动创建自己的进程。
PROCESS_COUNT = 6
def filter_list(aBigList, startV, endV, startP, endPr, minV):
list_chunks = list(chunks(aBigList, PROCESS_COUNT))
pool = multiprocessing.Pool(processes=PROCESS_COUNT)
for chunk in list_chunks:
pool.apply_async(func1, (chunk, startP, endPr))
pool.close()
pool.join()
while not queue.empty():
print(queue.get())
此外,chunks
函数可以简单地写为borrowed from this answer.
def chunks(l, n):
for i in range(0, len(l), n):
yield l[i:i + n]