Python多进程Pool返回IMapIterator对象而非整数结果如何解决
问题修复说明
核心问题点
pool.imap()参数使用错误:第一个参数需要传入未执行的函数对象,你写的rolldie()是直接调用函数后返回的整数,不符合要求;第二个参数要求传入可迭代对象,你传入整数0格式错误。imap()本身返回的是IMapIterator迭代器对象,必须遍历迭代器才能获取实际的执行结果,直接将迭代器存入列表打印就会输出对象地址。- 原有写法循环100次调用
imap完全没有发挥多进程的优势,属于错误的进程池使用姿势,且if __name__ == '__main__'的位置不符合多进程模块在Windows系统下的运行要求。
修复后可直接运行的代码
import random from multiprocessing import Pool def rolldie(_): # 占位参数,用于接收map方法传入的迭代值 # 1 = 正面,2 = 反面 return random.randint(1,2) if __name__ == '__main__': def main(): pool = Pool() # 一次性提交100次任务,map会自动返回所有结果组成的列表 out = pool.map(rolldie, range(100)) # 进程池标准收尾操作,避免资源泄漏 pool.close() pool.join() return out print(main())
可选:用imap逐次获取结果的写法
如果你需要边执行边拿结果,就用imap遍历迭代器即可:
if __name__ == '__main__': def main(): out = [] pool = Pool() # 遍历imap返回的迭代器,逐次拿到每次抛硬币的结果 for res in pool.imap(rolldie, range(100)): out.append(res) pool.close() pool.join() return out print(main())
内容的提问来源于stack exchange,提问作者Niko Weaver
相关产品推荐
相关产品推荐

