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
相关产品推荐
相关产品推荐

