You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:20:18