Python中无需每次等待函数执行完成即可获取返回值的实现方案
最优实现方案
不需要写入文件,也不需要引入asyncio增加复杂度,用后台线程+内存缓存的方案即可满足需求,实现成本极低,性能也最优。
核心逻辑
- 启动一个独立的后台守护线程,专门负责周期调用列表生成函数,完整生成新列表后直接替换内存中的缓存变量
- 主循环直接读取内存缓存的最新可用列表即可,无需等待生成过程
- 由于是完整生成后才替换缓存,不会出现读取到半生成的脏数据的问题
可运行示例代码
import threading import time # 你的原有列表生成函数,完全不用修改 def check_list(): # 模拟30-50秒的生成耗时 time.sleep(30) list1 = [1, 2, 3, 4] list_upd = [] for i in list1: if 4 > i > 1: list_upd.append(i) return list_upd # 内存缓存:存储最新的完整可用列表,初始可设置默认值,也可以首次启动先等待一次生成完成 latest_list = [] # 可选加锁,极端并发场景下保证读写安全,本场景不加也可以(Python变量赋值是原子操作) cache_lock = threading.Lock() # 后台更新线程的执行逻辑 def update_list_loop(): global latest_list while True: new_list = check_list() with cache_lock: latest_list = new_list # 启动后台线程,设置为守护线程,主程序退出时自动销毁 update_thread = threading.Thread(target=update_list_loop, daemon=True) update_thread.start() # 你的原有主循环,完全不用等待生成过程 while True: print("start") # 直接读缓存的列表即可 with cache_lock: current_list = latest_list.copy() for i in current_list: print(i) print("finish") # 主循环可以按自己的节奏跑,不用和列表生成的周期对齐 time.sleep(1)
方案优势
- 全程内存操作,没有磁盘IO开销,比写文件方案效率高几个量级
- 零侵入原有业务逻辑,不需要修改
check_list函数和主循环的核心流程 - 实现简单,没有asyncio的异步改写成本,同步代码直接兼容
- 完全满足需求:主循环永远拿到的是已经生成完成的完整列表,即使新列表还在生成中,也会返回上一个可用的版本
可选优化点
如果需要避免首次启动时缓存为空的问题,可以在启动后台线程后先阻塞等待第一次生成完成再启动主循环,代码如下:
# 启动后台线程后加这段 while not latest_list: time.sleep(0.1)
内容的提问来源于stack exchange,提问作者flashback
相关产品推荐
相关产品推荐

