如何异步同时运行无间隔while循环与3秒周期定时任务
实现方案
你现有代码是同步写法,用Python标准库就能实现需求,不需要额外安装第三方库,下面给两种可直接运行的稳定实现,两种方案都能保证两个任务互不阻塞:update()持续无间隔运行,output()每3秒执行一次。
方案1:threading线程实现(改造成本最低,适配现有同步代码)
这个方案不需要修改你原有函数的同步逻辑,只需要补全循环逻辑、加线程调度即可。
注意:你原有代码里的
update()只执行一次i递增,没有写持续循环,这是之前运行不符合预期的常见原因之一。
import threading import time i = 0 # 严谨场景可加线程锁避免读写冲突,简单计数场景可省略 count_lock = threading.Lock() def update(): global i while True: with count_lock: i += 1 # 主动让出CPU时间片,避免死循环占满单核,无实际延迟 time.sleep(0) def output(): while True: with count_lock: print(i) time.sleep(3) if __name__ == "__main__": # 启动两个独立守护线程 threading.Thread(target=update, daemon=True).start() threading.Thread(target=output, daemon=True).start() # 阻塞主线程,避免程序直接退出 while True: time.sleep(1)
方案说明:
- 两个线程由操作系统独立调度,完全互不阻塞
- 守护线程会随主线程自动退出,不需要手动处理线程回收
time.sleep(0)只会让出CPU执行权,不会给update循环增加可感知的延迟,同时避免CPU单核占用率拉满到100%
方案2:asyncio协程实现(资源开销更低)
如果偏好异步协程写法,可以用标准库asyncio实现,注意协程是协作式调度,必须主动让出控制权才能让其他任务运行。
import asyncio i = 0 count_lock = asyncio.Lock() async def update(): global i while True: async with count_lock: i += 1 # *必须await让出事件循环控制权*,否则其他协程永远无法执行——这是asyncio使用最常见的坑 await asyncio.sleep(0) async def output(): while True: async with count_lock: print(i) await asyncio.sleep(3) async def main(): # 并发调度两个协程任务 await asyncio.gather(update(), output()) if __name__ == "__main__": asyncio.run(main())
方案说明:
- 协程开销远低于线程,适合高并发场景
- 协程内禁止使用
time.sleep这类同步阻塞调用,否则会卡住整个事件循环,所有任务都会被阻塞 - 必须在长循环里加await点让出控制权,否则事件循环会被单个任务独占
之前尝试失败的常见原因
- 没有给
update()加while True外层循环,函数执行一次i递增就直接退出了 - 使用asyncio时没有在update循环里加await让出控制权,导致定时任务永远得不到调度
- 启动线程/协程后没有阻塞主线程,程序启动任务后直接运行结束退出
- 在异步协程里混用了同步阻塞方法,导致所有任务被串行执行
内容的提问来源于stack exchange,提问作者Michał Szostak
相关产品推荐
相关产品推荐

