如何让Python函数foo总运行时长不短于15分钟且不阻塞进程
实现方案
同步场景(仅阻塞当前调用线程,不影响进程内其他线程运行)
如果你的业务逻辑是同步代码,该方案仅会阻塞调用foo的单条线程,进程内其他线程可正常执行,不会阻塞整个进程:
import datetime import time def foo(): now = datetime.datetime.utcnow() required_delay = datetime.timedelta(minutes=15) # 此处放置你的可变耗时业务代码,会正常执行不受影响 # 示例:your_business_logic() # 计算剩余需要等待的时间 elapsed_time = datetime.datetime.utcnow() - now wait_seconds = (required_delay - elapsed_time).total_seconds() if wait_seconds > 0: time.sleep(wait_seconds) # 函数执行到此处时总运行时长已满足不短于15分钟的要求
说明:如果业务代码实际运行时长已经超过15分钟,不会额外等待,直接返回,符合总时长不短于15分钟的要求。
异步场景(完全非阻塞,不影响进程内其他协程运行)
如果你的项目使用异步技术栈,希望等待过程中完全不阻塞进程,可以使用异步等待方案:
import datetime import asyncio async def foo(): now = datetime.datetime.utcnow() required_delay = datetime.timedelta(minutes=15) # 此处放置你的异步业务代码,正常执行不受影响 # 示例:await your_async_business_logic() elapsed_time = datetime.datetime.utcnow() - now wait_seconds = (required_delay - elapsed_time).total_seconds() if wait_seconds > 0: await asyncio.sleep(wait_seconds) # 函数执行到此处时总运行时长已满足不短于15分钟的要求
说明:
asyncio.sleep是异步非阻塞实现,等待过程中事件循环可以正常调度其他协程任务,整个进程不会被阻塞。
内容的提问来源于stack exchange,提问作者M. Koz
相关产品推荐
相关产品推荐

