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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:48:03