使用Python multiprocessing模块时无法创建新线程的问题咨询
解决multiprocessing无法创建新进程的问题
嘿,我来帮你捋捋这个问题~你提到用manager.dict()共享数据时遇到无法创建新进程的情况,大概率是这几个原因导致的,咱一个个说:
1. 进程数量爆炸,触发系统限制
从你的代码片段看,应该是打算给list_one里的每个item都创建一个独立进程吧?如果list_one是超大列表,那瞬间创建成百上千甚至上万个进程,直接就撞了系统的进程数上限——系统不可能允许无限制创建进程,不然资源会被耗尽。
解决办法:用进程池限制并发数
别给每个item单独开进程,改用multiprocessing.Pool来复用进程,既控制了并发数,又能提高效率。比如根据你的CPU核心数设置合理的池大小(一般是核心数的1-2倍):
import multiprocessing def my_function(args): item, list_two = args # 这里替换成你的I/O操作和数据库逻辑 # 注意:原代码里遍历list_two后,return_dict[item]会被最后一个val覆盖,这是你预期的吗? # 如果是要保存item和每个val的组合结果,建议把key设为(item, val)避免覆盖 results = {} for val in list_two: new_value = item + val # 替换为实际业务逻辑 results[(item, val)] = new_value return results if __name__ == "__main__": list_one = [1, 2, 3, ...] # 你的超大列表 list_two = [10, 20, 30, ...] # 你的另一个超大列表 # 基于CPU核心数设置进程池大小,避免资源浪费 pool_size = multiprocessing.cpu_count() * 2 with multiprocessing.Pool(pool_size) as pool: # 把每个item和list_two打包成参数列表 task_args = [(item, list_two) for item in list_one] # 批量执行任务,收集所有结果 all_results = pool.map(my_function, task_args) # 合并所有进程的结果到一个字典 return_dict = {} for res in all_results: return_dict.update(res) # 后续处理return_dict...
2. 超大列表重复复制,耗尽内存
如果list_two也是超大列表,直接把它作为参数传给每个进程,会导致每个进程都复制一份list_two到自己的内存空间,分分钟把内存占满,系统也会拒绝创建新进程。
解决办法:用Manager共享大列表
通过manager.list()把list_two变成进程间共享的对象,避免重复复制:
if __name__ == "__main__": manager = multiprocessing.Manager() # 把list_two转为共享列表 shared_list_two = manager.list(list_two) pool_size = multiprocessing.cpu_count() * 2 with multiprocessing.Pool(pool_size) as pool: task_args = [(item, shared_list_two) for item in list_one] all_results = pool.map(my_function, task_args) return_dict = {} for res in all_results: return_dict.update(res)
3. 系统资源限制(比如文件句柄、内存)
如果上面的优化还不行,就得检查系统层面的限制了:
- Linux/macOS可以用
ulimit -u查看当前用户允许的最大进程数,用ulimit -n查看文件句柄限制; - Windows可以通过任务管理器查看当前进程数和内存占用,确认是不是资源被耗尽了。
如果是系统限制,可以适当调整,但更建议通过进程池控制并发数来解决,毕竟盲目调大限制可能导致系统不稳定。
额外提醒:原代码的逻辑小问题
你原代码里每个进程遍历list_two后,会把return_dict[item]反复覆盖,最后只保留最后一个val对应的new_value——这如果不是你预期的逻辑,记得把字典的key改成(item, val)这样的组合键,避免数据丢失哦~
内容的提问来源于stack exchange,提问作者dragonfire_007
相关产品推荐
相关产品推荐

