如何复用加载函数的Python进程,多次传入不同参数调用?
复用单个Python进程多次调用函数的方案
你要的是让子进程常驻、不用每次重新创建,通过进程间通信传参调用函数的效果,完全可以用multiprocessing自带的队列(Queue)或者管道(Pipe)实现,没必要上Celery这种重型框架。
核心思路
让子进程启动后进入循环,持续监听主进程发来的任务(参数+函数调用指令),执行完成后可返回结果,直到收到终止信号才退出。这样既避免了反复创建进程的开销,又能绕过GIL。
代码示例(用Queue实现)
from multiprocessing import Process, Queue def worker(task_queue, result_queue): # 子进程常驻循环,持续监听任务队列 while True: task = task_queue.get() # 收到None就作为终止信号,退出循环 if task is None: result_queue.put("Worker exited") break # 解析任务:函数标识 + 参数组 func_tag, args = task if func_tag == "add": a, b = args result = a + b result_queue.put(result) # 这里可以扩展其他函数,比如添加subtract、multiply等分支 if __name__ == "__main__": task_q = Queue() result_q = Queue() # 启动常驻子进程 p = Process(target=worker, args=(task_q, result_q)) p.start() # 第一次调用add task_q.put(("add", (5, 5))) print(result_q.get()) # 输出10 # 第二次调用add task_q.put(("add", (10, 20))) print(result_q.get()) # 输出30 # 发送终止信号,结束子进程 task_q.put(None) print(result_q.get()) # 输出Worker exited p.join()
关键说明
- 之前你的代码报错
AssertionError: cannot start a process twice,是因为Process对象的start()只能调用一次,进程执行完毕就会销毁;现在的方案让子进程一直处于循环监听状态,自然不存在重复启动的问题。 - 主进程通过往任务队列里投放「函数标识+参数」的元组,子进程解析后执行对应逻辑,还可以轻松扩展支持多个函数。
- 如果需要更灵活的双向通信,也可以用
Pipe替代Queue,逻辑框架基本一致。
其他轻量替代方案
如果需要复用多个进程,multiprocessing.Pool自带进程复用机制,比如apply_async可以多次提交任务到池内的空闲进程,不用自己手动管理进程间通信,适合多任务并行的场景。
如果只是本地单个进程的复用,用Queue的方案最直接轻量,完全满足需求——Celery更适合分布式任务场景,本地使用反而会增加不必要的复杂度。
内容的提问来源于stack exchange,提问作者Kalosst0
相关产品推荐
相关产品推荐

