Python turtle的ontimer方法并发机制及同延迟定时器处理规则
相同时长定时器的处理逻辑
当你调用turtle.ontimer()注册两个及以上等待时长完全相同的定时器时,处理规则非常明确:
- 不会对相同时长的定时器做去重、优先级重排,每个注册的定时器都是独立的调度单元,哪怕回调函数、等待时长完全一致,也不会被合并成一次触发
- 触发顺序严格匹配
ontimer()的调用先后顺序:等待时长到期后,回调函数会按照注册顺序依次进入待执行队列 - 所有回调不存在并行执行的可能:如果先注册的回调内部存在耗时阻塞逻辑,后注册的同周期定时器必须等前一个回调执行完毕才会运行,不会出现抢占执行的情况
举个最直观的例子,连续执行两行ontimer(lambda: print("触发"), 1000),等待1秒后会先后输出两次“触发”,不会只触发一次。
底层实现机制
turtle.ontimer()既没有使用多线程,也没有使用多进程,整个调度逻辑完全依托Tkinter的单线程主事件循环实现:
- turtle本身是构建在Tkinter之上的绘图库,调用
ontimer()时,本质是把传入的回调函数、等待时长参数透传给底层Tkinter窗口的after调度接口 - Tkinter内部维护了一个按触发时间升序排列的事件队列,主循环在单线程内持续轮询队列状态,到达预设触发时间就取出对应回调执行
- 包括turtle的界面渲染、鼠标/键盘交互响应、定时器触发在内的所有界面相关逻辑,全部运行在同一个主线程中,没有额外开辟独立线程或进程处理定时任务
也正因为是单线程调度模型,不要在定时器回调里放长时间阻塞的代码(比如无sleep的死循环、大规模耗时计算),否则会直接堵死整个事件循环,不仅同周期定时器会延迟触发,整个绘图窗口都会出现无响应的问题。
内容的提问来源于stack exchange,提问作者Gold_Leaf
相关产品推荐
相关产品推荐

