【问题标题】:Can I pass queue object in multiprocessing pool starmap method [duplicate]我可以在多处理池星图方法中传递队列对象吗?
【发布时间】:2019-12-30 14:53:27
【问题描述】:

SO 中有很多关于在 python 多处理池的 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 方法也应该能够支持。

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 为什么经理在这里有所作为?
    • @quamrana 来自我链接到的文档:A manager object returned by Manager() controls a server process which holds Python objects and allows other processes to manipulate them using proxies. 我个人对它是如何在内部实现的一无所知。
    • 哦哇@RomanPerekhrest,完全一样,我什至没有在回答之前检查......对不起。
    • 我认为有一个剩余的p = {} 没有任何用途?
    猜你喜欢
    • 1970-01-01
    • 2017-04-21
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    相关资源
    最近更新 更多