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

Python如何避免等待带sleep延时的类实例执行完成再启动第二个实例

问题根因

当前流程阻塞的核心是调用了Future.result()方法,该方法会强制阻塞当前主线程,直到对应异步任务执行完成并返回结果。你按顺序遍历myobjectx、myobjecty调用result时,即便myobjectx仅需5秒就执行完成,调用myobjecty.result()时还是会等待20秒直到该任务结束,后续while循环中的result调用也是同理,只要任务未执行完成就会卡住主线程。

可行解决思路
  • 优先采用非阻塞判断逻辑:调用Future.done()属性判断任务是否执行完成,仅当任务完成时再调用result()获取结果,未完成的任务直接跳过,完全不会阻塞主流程
  • 按完成顺序处理任务:用concurrent.futures.as_completed()遍历任务列表,谁先执行完成就先处理谁的结果,避免等待慢任务
  • 超时控制:给result()设置超时参数,例如each_instance.result(timeout=0.1),捕获超时异常后直接跳过当前任务,也不会产生阻塞
改造后可运行代码
import time
import datetime
from concurrent.futures import ThreadPoolExecutor


xyz = {'delay': 5, 'name': '5_s_delay'}
xyz1 = {'delay': 20, 'name': '20_s_delay'}

class MyClass():
    def __init__(self, params, **kwargs):
        self.delay = params.get('delay')
        print("delay is: ", self.delay)
        self.name = params.get('name')
        time.sleep(self.delay)
        print(f"end of init function, thread name: {self.name}, {datetime.datetime.now().strftime('%H:%M:%S')}")
        self.function()

    def function(self):
        print("function initiated \n\n")


if __name__ == '__main__':
    executor = ThreadPoolExecutor(max_workers=2)
    # 保存所有任务
    task_list = [
        executor.submit(MyClass, xyz),
        executor.submit(MyClass, xyz1)
    ]

    # 首次遍历不阻塞
    print("=====首次遍历开始=====")
    for each_task in task_list:
        if each_task.done():
            print("For loop:", each_task.result())
            print("For loop:", each_task.result().name)
        else:
            print(f"For loop: 任务尚未完成,跳过处理,{datetime.datetime.now().strftime('%H:%M:%S')}")

    # 循环监听也不阻塞
    print("=====循环监听开始=====")
    while True:
        for each_task in task_list:
            if each_task.done():
                print("\nwhile true loop:", each_task.result().name, datetime.datetime.now().strftime('%H:%M:%S'))
            else:
                print(f"\nwhile true loop: 任务尚未完成,跳过,{datetime.datetime.now().strftime('%H:%M:%S')}")
            print("end of for loop")
        time.sleep(2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:54:04