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

Python multiprocessing函数执行无效果,代码运行结果异常如何排查

Python多进程代码问题排查

核心问题1:进程内存空间相互隔离

Python multiprocessing 模块创建的子进程会独立复制父进程的所有内存数据,各自拥有独立的地址空间。你在子进程中对startingList、evenNumbers、unEvenNumbers三个全局列表的修改,只会保存在子进程自己的内存副本中,父进程的全局变量完全不会被改动,所以最终打印的结果全是空列表。

核心问题2:进程执行顺序不可控

你同时启动了填充列表的p1进程和处理数据的p2进程,操作系统的进程调度是随机的,就算内存可以共享,也大概率出现p2先执行、此时startingList还未被填充的情况,一样拿不到预期结果。

其他小问题

原始代码缺少import multiprocessing和import time导入语句,直接运行会抛出模块未找到错误。

修复示例

我们可以用multiprocessing.Manager提供的共享容器实现跨进程数据共享,同时调整进程启动顺序保证先填充数据再处理:

import multiprocessing
import time

def fill_list(number, shared_list):
    for x in range(1, number):
        shared_list.append(x)

def test(shared_input, shared_even, shared_uneven):
    for num in shared_input:
        if num % 2 == 0:
            shared_even.append(num)
        else:
            shared_uneven.append(num)

if __name__ == '__main__':
    # 初始化可跨进程共享的列表对象
    with multiprocessing.Manager() as manager:
        startingList = manager.list()
        evenNumbers = manager.list()
        unEvenNumbers = manager.list()

        start = time.perf_counter()
        # 先启动填充进程,等执行完成再启动处理进程
        p1 = multiprocessing.Process(target=fill_list, args=(17, startingList))
        p1.start()
        p1.join()

        p2 = multiprocessing.Process(target=test, args=(startingList, evenNumbers, unEvenNumbers))
        p2.start()
        p2.join()
        end = time.perf_counter()

        # 共享列表转普通列表打印更直观
        print(list(startingList), "\n", list(evenNumbers), "\n", list(unEvenNumbers))

内容的提问来源于stack exchange,提问作者GuwniakSmierdzoncy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:24:06