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

2024-10-02 22:30:28 发布

您现在位置:Python中文网/ 问答频道 /正文

在python的多处理中,我很难集中精力处理两件事。我研究过文件,但还是不明白:

  1. 如何在n-loop中启动并加入进程(非重复代码,不知道我是否需要在Process循环中执行任何特殊操作)
  2. 如何将每个流程的结果添加到列表中。在

目的:分解一个巨大的列表并分别运行每个块,以便更快地运行。在

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)

Tags: targetqueueargsprocessstartchunksjoinp2
1条回答
网友
1楼 · 发布于 2024-10-02 22:30:28

使用工作池

pythonmultiprocessing标准库为这个用例提供了一个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.

^{pr2}$

相关问题 更多 >