python - 我可以在多处理池星图方法中传递队列对象吗
问题描述
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 方法也应该能够。
解决方案
尝试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
推荐阅读
- r - 在 r 中循环数据帧中的过程
- python - 将 NumPy 二维数组与列连接(一维数组)
- docker - 当 docker-compose 中有两个服务时,Docker 不会构建和运行第一个服务
- java - GWT - 将字符串转换为浮点数 2 位小数
- scrapy - 尝试使用scrapy登录网站,响应显示登录页面
- php - 更改 Wordpress 类别小部件占位符文本?
- regex - Notepad++ 仅返回 XML 标记中的内容
- go - 特定于模型的寄存器?
- swiftui - 使用 SwiftUI 时异步填充/预填充多个用户可变的“@State”值?
- reactjs - 在 ReactJS 组件中,当循环遍历 props 数组时,我只能使用循环的简写语法。为什么是这样?