本文深入探讨了在python多进程编程中使用`multiprocessing.pool.starmap`结合`syncmanager.dict`时可能遇到的空结果问题。核心在于`zip`函数与空可迭代对象的行为,以及如何正确构造传递给`starmap`的参数列表。通过详细的代码示例和解释,文章展示了如何避免`zip`陷阱,并确保共享字典在多进程环境中被正确填充和访问,从而实现预期的并行计算和数据共享。
在Python多进程编程中,multiprocessing模块提供了强大的工具来利用多核CPU进行并行计算。Pool对象及其starmap方法常用于将一个函数应用于一组参数,而SyncManager则允许在不同进程间共享数据结构,如字典。然而,不当的参数构造方式可能导致意想不到的空结果。
考虑以下使用multiprocessing.Pool和SyncManager.dict的场景:
import multiprocessing as mp
from multiprocessing.managers import SyncManager
n_cores = mp.cpu_count()
def parallel_fn(job_n, cache):
# 尝试将结果存入共享缓存
cache['job_b'] = job_n # 这里的键名可能不是我们想要的
return job_n
if __name__=="__main__":
with SyncManager() as manager:
shared_cache = manager.dict()
# 尝试构造starmap的参数
args = list(zip(range(n_cores), shared_cache))
with mp.Pool(n_cores) as pool:
result = pool.starmap(parallel_fn, args)
print(f"Pool return: {result}")
print(f"Shared dict after: {shared_cache}")运行上述代码,我们可能会得到如下输出:
Pool return: []
Shared dict after: {}尽管我们期望Pool返回n_cores个结果,并且shared_cache被填充,但实际结果却是空的。这表明parallel_fn根本没有被执行,或者说starmap接收到了一个空的参数列表。
导致上述问题的主要原因是zip函数的行为。zip函数会聚合每个可迭代对象中对应位置的元素,并生成一个由这些元素组成的元组。它的关键特性是:当最短的可迭代对象被耗尽时,zip就会停止。
在我们的示例中,args = list(zip(range(n_cores), shared_cache))这一行是问题的症结所在。
当zip函数接收到一个长度为8的range对象和一个长度为0的ProxyDict对象时,它会立即停止,因为shared_cache已经耗尽。因此,zip返回一个空的迭代器,list(zip(...))的结果自然就是一个空列表。
我们可以通过一个简单的例子来验证这一点:
print(list(zip([1, 2, 3], dict()))) # 输出: [] print(list(zip(range(5), []))) # 输出: []
由于args列表为空,pool.starmap自然不会执行任何任务,从而返回一个空列表,并且shared_cache也保持为空。
要解决这个问题,我们需要确保starmap接收到一个包含正确数量和结构参数的列表。最直接且推荐的方法是使用列表推导式来显式地构造参数列表。
同时,我们也注意到原始代码中parallel_fn内部将键固定为'job_b'。通常,我们希望将任务相关的标识符(例如job_n)作为键来存储数据,以避免不同任务覆盖相同键的值。
以下是修正后的代码:
import multiprocessing as mp
from multiprocessing.managers import SyncManager
n_cores = mp.cpu_count()
def parallel_fn(job_n, cache):
"""
并行执行的函数,将任务编号和结果存入共享缓存。
"""
# 将 job_n 作为键存储,而不是固定的 'job_b'
cache[job_n] = job_n
print(f"Process {mp.current_process().name} processing job {job_n}")
return job_n
if __name__=="__main__":
with SyncManager() as manager:
shared_cache = manager.dict()
# 使用列表推导式正确构造starmap的参数
# 每个元组包含一个任务编号和一个共享字典的引用
args = [(n, shared_cache) for n in range(n_cores)]
print(f"Constructed args for starmap: {args}")
with mp.Pool(n_cores) as pool:
print("Starting pool.starmap...")
result = pool.starmap(parallel_fn, args)
print(f"Pool return: {result}")
print(f"Shared dict after: {shared_cache}")运行修正后的代码(假设我的机器是8核),输出如下:
Constructed args for starmap: [(0,), (1, ), (2, ), (3, ), (4, ), (5, ), (6, ), (7, )] Starting pool.starmap... Process ForkPoolWorker-1 processing job 0 Process ForkPoolWorker-2 processing job 1 Process ForkPoolWorker-3 processing job 2 Process ForkPoolWorker-4 processing job 3 Process ForkPoolWorker-5 processing job 4 Process ForkPoolWorker-6 processing job 5 Process ForkPoolWorker-7 processing job 6 Process ForkPoolWorker-8 processing job 7 Pool return: [0, 1, 2, 3, 4, 5, 6, 7] Shared dict after: {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7}
从输出可以看出,args列表现在包含了n_cores个元组,每个元组都携带了任务编号和shared_cache的引用。parallel_fn被成功执行了n_cores次,pool.starmap返回了预期的结果列表,并且shared_cache也被正确地填充了数据。
避免键冲突:在向共享字典写入数据时,如果每个进程都有自己的结果需要存储,应使用唯一的键来避免数据覆盖。将任务编号或其他唯一标识符作为键是常见的做法。通过理解这些核心概念和避免常见陷阱,开发者可以更有效地利用Python的multiprocessing模块进行并行计算,并正确管理进程间的共享数据。
# python
# 工具
# ai
# proxy
# 常见问题
# 可迭代对象
# red
相关文章:
制作门户网站的参考文献在哪,小说网站怎么建立?
如何在企业微信快速生成手机电脑官网?
c# 在ASP.NET Core中管理和取消后台任务
建站之星安装后如何配置SEO及设计样式?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
安徽网站建设与外贸建站服务专业定制方案
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
如何零成本快速生成个人自助网站?
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
如何用花生壳三步快速搭建专属网站?
如何在阿里云服务器自主搭建网站?
建站之星安装后如何自定义网站颜色与字体?
建站主机服务器选购指南:轻量应用与VPS配置解析
建站之星如何配置系统实现高效建站?
如何在阿里云部署织梦网站?
如何通过虚拟主机空间快速建站?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
如何获取上海专业网站定制建站电话?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
如何在阿里云完成域名注册与建站?
网站微信制作软件,如何制作微信链接?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
北京的网站制作公司有哪些,哪个视频网站最好?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
用v-html解决Vue.js渲染中html标签不被解析的问题
如何选择PHP开源工具快速搭建网站?
如何通过FTP服务器快速搭建网站?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
制作网站怎么制作,*游戏网站怎么搭建?
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
子杰智能建站系统|零代码开发与AI生成SEO优化指南
如何配置WinSCP新建站点的密钥验证步骤?
建站主机解析:虚拟主机配置与服务器选择指南
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
如何通过服务器快速搭建网站?完整步骤解析
如何用美橙互联一键搭建多站合一网站?
建站为何优先选择香港服务器?
如何在IIS服务器上快速部署高效网站?
简历在线制作网站免费版,如何创建个人简历?
如何通过VPS建站实现广告与增值服务盈利?
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
如何高效生成建站之星成品网站源码?
c++ stringstream用法详解_c++字符串与数字转换利器
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
韩国服务器如何优化跨境访问实现高效连接?
如何用狗爹虚拟主机快速搭建网站?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
北京网站制作的公司有哪些,北京白云观官方网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。