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
相关产品推荐
相关产品推荐

