我可以在多处理池星形图方法中传递队列对象吗?

时间:2019-08-26 11:56:07

标签: python python-3.x python-multiprocessing

SO中有很多关于在python multiprocessing Pool的starmap方法中传递多个参数的问题。但是我想问的是,是否可以在可以在不同进程之间共享的方法中发送队列对象?

我可以使用线程和多处理Process方法来执行此操作,但不能使用Pool的starmap方法。

from multiprocessing import Process, Queue, Pool


def get_data(pageNo,q):
    q.put(pageNo*pageNo)


if __name__ == "__main__":
    q = Queue()
    p = {}
    no_pages = 5
    pool_tuple = [(x,q) for x in range(1,no_pages)]
    with Pool(processes=3) as pool:
        pool.starmap(get_data, pool_tuple)

我想要的是我应该能够将不同进程的结果放入队列中。 我得到的错误是:队列对象只能通过继承在进程之间共享

我在传递队列对象的方式上做错了吗?因为如果Process支持这一点,那么Pool方法也应该能够。

1 个答案:

答案 0 :(得分:1)

尝试像这样使用Manager()

from multiprocessing import Manager, Pool


def get_data(pageNo, q):
    q.put(pageNo * pageNo)


if __name__ == "__main__":
    m = Manager()
    q = m.Queue()
    p = {}
    no_pages = 5
    pool_tuple = [(x, q) for x in range(1, no_pages)]
    with Pool(processes=3) as pool:
        pool.starmap(get_data, pool_tuple)
    for i in range(1, no_pages):
        print("result", i, ":", q.get())

输出:

result 1 : 1
result 2 : 4
result 3 : 9
result 4 : 16