python多处理队列实现

Fly*_*ra1 2 python queue multiprocessing

我无法理解如何将队列实现到下面的多处理示例中。基本上,我希望代码:

1)产生2个进程(完成)

2)将我的 id_list 分成两部分(完成)

3)让每个进程迭代列表打印出每个项目,并且只有在完成列表后才关闭。我知道我必须实现某种类型的排队系统,并将其传递给每个工作人员,但我不确定如何做到这一点。任何帮助将非常感激。

from multiprocessing import Pool,Queue
id_list = [1,2,3,4,5,6,7,8,9,10]

def mp_worker(record):
    try:  
        print record
        sleep(1)
    except: pass
    print "worker closed"

def mp_handler():
    p = Pool(processes = 2) #number of processes
    p.map(mp_worker, id_list)  #devides id_list between 2 processes, defined above
    p.close()
    p.join()

mp_handler()
Run Code Online (Sandbox Code Playgroud)

注意 - 代码打印出“工人关闭”10 次。我希望这条语句只打印两次(每个工人一次,在每个工人从 id_list 打印出 5 个数字之后)

ric*_*ert 7

这对我有用(在 Python 3 上)。我没有使用池,而是生成了自己的两个进程:

from multiprocessing import Process, Queue
from time import sleep


id_list = [1,2,3,4,5,6,7,8,9,10]

queue = Queue()

def mp_worker(queue):

    while queue.qsize() >0 :
        record = queue.get()
        print(record)
        sleep(1)

    print("worker closed")

def mp_handler():

    # Spawn two processes, assigning the method to be executed 
    # and the input arguments (the queue)
    processes = [Process(target=mp_worker, args=(queue,)) for _ in range(2)]

    for process in processes:
        process.start()
        print('Process started')

    for process in processes:
        process.join()



if __name__ == '__main__':

    for id in id_list:
        queue.put(id)

    mp_handler()
Run Code Online (Sandbox Code Playgroud)

尽管要处理的元素的长度是硬编码的。但它可能是 mp_worker 方法的第二个输入参数。