无法修改非异步函数,如何在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
相关产品推荐
相关产品推荐

