Python多进程传参调用同一函数串行,如何实现同时并行运行
问题根源
你的代码串行是两处写法错误共同导致的:
multiprocessing.Process的target参数接收的是函数对象引用,不能直接在参数位置加括号调用函数。你写的target=abc('www.google.com',7265,'abc.csv'),执行逻辑是:先在主进程同步执行abc函数,等函数完全跑完拿到返回值(无return时返回None),才会把返回值传给target再启动进程。等于三个abc全是在主进程按顺序执行,根本没交给子进程调度,自然不会并行。- 你写的
multiprocessing.process是模块名,正确的进程类是大写开头的multiprocessing.Process,原写法本身也会触发属性报错。
正确实现方案
你需要跑7次任务的话,推荐把所有任务参数统一存在列表里批量创建进程,不用手写重复代码,两种常用实现方式如下:
方案1:手动管理进程(灵活度高)
通过args参数给目标函数传位置参数,子进程启动后才会真正调用abc函数,所有进程启动后就是并行执行状态:
import multiprocessing import time # 你的业务函数 def abc(Link, rangeTo, filename): # 替换成你的实际逻辑 print(f"启动任务:输出文件{filename},抓取链接{Link},范围值{rangeTo}") time.sleep(3) # 模拟耗时操作 print(f"任务完成:{filename}") if __name__ == "__main__": # 把7次运行的参数按顺序填到列表里即可 task_list = [ ("www.google.com", 7265, "abc.csv"), ("www.google2.com", 765, "abc1.csv"), ("www.google3.com", 726, "abc2.csv"), # 剩余4组参数按相同格式补充 ] process_pool = [] # 批量创建并启动所有进程 for param in task_list: p = multiprocessing.Process(target=abc, args=param) process_pool.append(p) p.start() # 等待所有进程执行完毕,避免主进程提前退出 for p in process_pool: p.join()
方案2:用进程池调度(写法更简洁)
如果任务量较大,可以用内置进程池自动管理进程生命周期,不需要手动维护进程列表:
import multiprocessing import time def abc(Link, rangeTo, filename): print(f"启动任务:输出文件{filename},抓取链接{Link},范围值{rangeTo}") time.sleep(3) print(f"任务完成:{filename}") if __name__ == "__main__": task_list = [ ("www.google.com", 7265, "abc.csv"), ("www.google2.com", 765, "abc1.csv"), ("www.google3.com", 726, "abc2.csv"), # 剩余4组参数按相同格式补充 ] # processes参数设为任务总数,即可实现所有任务同时启动并行执行 with multiprocessing.Pool(processes=len(task_list)) as pool: pool.starmap(abc, task_list)
注意事项
- Windows/macOS系统下写多进程代码,必须把进程启动逻辑放在
if __name__ == "__main__":代码块中,否则会出现递归启动子进程的报错。 - 如果需要所有任务完全并行,进程/进程池的并发数不要小于总任务数,否则多余任务会排队等待执行。
- 禁止在给
target传参时直接加括号调用目标函数,函数名后不要加括号,参数统一通过args(位置参数,元组格式)或kwargs(关键字参数,字典格式)传入。
内容的提问来源于stack exchange,提问作者sufyan jamil
相关产品推荐
相关产品推荐

