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

无法修改非异步函数,如何在funca执行时立即触发funcb?

非异步函数并行执行的可行方案

需求回顾

现有两个非异步函数:

def funca():
    do_somethhing()
    call_some_api()

def funcb():
    do_somethhing()
    call_some_api()

原执行逻辑为funca()执行完成后再启动funcb(),需求是让funca()启动后仍在处理过程中时,立刻触发funcb()执行;且不能修改函数实现、不能采用异步调用方式。

结论:完全可以实现

通过Python的多线程或多进程机制即可满足需求,两者均无需修改原函数,也不属于异步调用范畴。


方案1:多线程(适合IO密集型场景)

如果函数中的call_some_api()是网络请求、文件读写这类IO密集型操作,多线程是最优选择——GIL在IO等待阶段会自动释放,能实现高效的并发执行。

代码示例:

import threading

def funca():
    do_somethhing()
    call_some_api()

def funcb():
    do_somethhing()
    call_some_api()

# 创建线程对象,绑定目标函数
thread_a = threading.Thread(target=funca)
thread_b = threading.Thread(target=funcb)

# 启动线程:调用start()后,funca会立刻开始执行,随后funcb也会马上启动
thread_a.start()
thread_b.start()

# 可选:等待两个线程全部执行完毕再继续后续逻辑
thread_a.join()
thread_b.join()

方案2:多进程(适合CPU密集型场景)

如果函数中的do_somethhing()是大量计算这类CPU密集型操作,多线程受GIL限制无法实现真正并行,此时用多进程更合适——每个进程拥有独立的Python解释器和GIL,能充分利用多核CPU资源。

代码示例:

import multiprocessing

def funca():
    do_somethhing()
    call_some_api()

def funcb():
    do_somethhing()
    call_some_api()

if __name__ == "__main__":
    # 创建进程对象,绑定目标函数
    process_a = multiprocessing.Process(target=funca)
    process_b = multiprocessing.Process(target=funcb)

    # 启动进程:两个进程会几乎同时开始执行各自的函数
    process_a.start()
    process_b.start()

    # 可选:等待两个进程全部执行完毕
    process_a.join()
    process_b.join()

关键说明

  • 两种方案均未修改原函数的实现逻辑,完全符合“无法控制funca和funcb实现”的限制;
  • 异步调用特指async/await相关的异步编程模型,而多线程/多进程属于独立的并发/并行实现方式,满足“不得采用异步调用”的要求;
  • 调用start()方法后,目标函数会立刻进入执行状态,无需等待前一个函数执行完成,完全满足“funca处理过程中立即触发funcb”的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:47:40