Python并行执行两同功能函数取最快结果并终止慢函数实现方法
实现方案
核心用Python标准库concurrent.futures实现,零侵入原有函数逻辑,不需要修改func_a()、func_b()的内部代码,即可实现「并行运行、取首个返回结果、终止剩余慢任务」的需求。
由于你的场景是拉取Binance接口数据,属于IO密集型任务,优先用线程池实现,开销小、适配性强;如果两个函数内部包含大量CPU密集型计算,把线程池替换为进程池即可,核心逻辑完全不变。
核心实现代码
from concurrent.futures import ThreadPoolExecutor, wait, FIRST_COMPLETED # 以下两个函数为你已有的、不可修改的原有逻辑 def func_a(): # 原有拉取Binance数据、计算的逻辑,保持原样即可 pass def func_b(): # 原有拉取Binance数据、计算的逻辑,保持原样即可 pass def fetch_fastest_data(): # 初始化容量为2的线程池,刚好承载两个并行任务 with ThreadPoolExecutor(max_workers=2) as executor: # 向线程池提交两个任务 task_a = executor.submit(func_a) task_b = executor.submit(func_b) # 阻塞等待,直到任意一个任务执行完成 done_tasks, pending_tasks = wait( [task_a, task_b], return_when=FIRST_COMPLETED ) # 取首个完成的任务结果,增加异常兼容:如果先跑完的任务抛错,就取后完成的结果 first_finish = next(iter(done_tasks)) try: final_result = first_finish.result() except Exception: rest_task = next(iter(pending_tasks)) final_result = rest_task.result() # 强制取消所有还在运行的慢任务,释放网络、线程资源 for task in pending_tasks: task.cancel() return final_result
使用说明
- 每分钟定时执行的逻辑,直接在外层封装定时调度即可:简单场景可以用
while True循环加time.sleep(60)实现,需要更可靠的调度可以用定时任务库,不影响核心取数逻辑。 - 不要手动写原生线程+全局标志位的终止逻辑:这类实现很难正确回收网络连接、线程栈资源,容易出现内存泄漏、连接占满的问题,标准库的实现已经做了兼容处理。
- 如果你的函数后续扩展到更多个同逻辑实现,只需要把新的函数提交到线程池,
wait方法会自动等待第一个完成的任务,不需要改核心逻辑。
内容的提问来源于stack exchange,提问作者ghost
相关产品推荐
相关产品推荐

