python - 多处理共享值进程和循环

时间:2017-07-10 21:47:42

标签: python multiprocessing

我很难在python的多处理过程中绕过两件事。我研究过这些文档,但仍然不明白:

  1. 如何以n-loop启动和加入流程(非重复代码,不知道我是否需要在Process循环中执行任何特殊操作)
  2. 如何将结果添加到每个相应流程的列表中。
  3. 目的:分解一个巨大的列表并分别运行每个块以获得更快的运行时间。

    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)
    

1 个答案:

答案 0 :(得分:2)

使用工作池

python multiprocessing标准库为此用例提供nice class that can be very helpfulmultiprocessing.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]