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

如何复用加载函数的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:34:56