我可以在多处理池星图方法中传递队列对象吗
Can I pass queue object in multiprocessing pool starmap method
关于在python multiprocessing Pool 的starmap 方法中传递多个参数,SO 中有很多问题。但是我想问的是能否在不同进程之间共享的方法中发送一个队列对象?
我可以使用线程和多处理 Process 方法来执行此操作,但不能使用 Pool 的星图方法。
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 方法也应该能够。
尝试像这样使用 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
关于在python multiprocessing Pool 的starmap 方法中传递多个参数,SO 中有很多问题。但是我想问的是能否在不同进程之间共享的方法中发送一个队列对象?
我可以使用线程和多处理 Process 方法来执行此操作,但不能使用 Pool 的星图方法。
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 方法也应该能够。
尝试像这样使用 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