我能否在多进程池的starmap方法中传递队列对象?

4

在SO网站上,有很多关于在Python多进程池的starmap方法中传递多个参数的问题。但我的问题是,我是否可以在该方法中发送队列对象,以便在不同进程之间共享?

我可以使用线程和多进程Process方法来实现这一点,但不能使用进程池的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个回答

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

1
经理在这里为什么很重要? - quamrana
从我链接的文档中可以看到,Manager()返回的管理器对象控制一个服务器进程,该进程持有Python对象并允许其他进程使用代理操作它们。我个人对其内部实现没有任何想法。 - Adam.Er8
使用Python编写的程序可以在Windows和Linux系统上运行。为了实现跨平台兼容性,应该避免使用特定于某个操作系统的功能和库。Python提供了许多标准库,这些库在不同的操作系统上都能正常工作,应该尽可能地使用它们。如果必须使用特定于操作系统的功能或库,则可以使用条件语句根据当前操作系统选择不同的代码路径。 - RomanPerekhrest
1
哦,哇@RomanPerekhrest,完全重复了,我甚至在回答之前都没有检查...抱歉。 - Adam.Er8
有一个剩余的 p = {} 没有任何用处,我认为是吗? - inc42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接