Python threading.Timer打印混乱,是执行顺序异常还是仅输出问题?
问题结论
你遇到的打印错乱仅属于输出层面的问题,定时器回调的执行逻辑本身完全正常,不存在前一次迭代未完成就启动下一次干扰业务逻辑的情况。
根因分析
Python的内置print()函数本身不是线程安全的:
print()执行时会拆分为两个独立操作:先输出传入的内容文本,再输出换行符\n- 多个线程同时调用
print()时,两个操作的间隙可能被其他线程的打印操作抢占,导致多个线程的内容、换行符拼接错位,就出现了你看到的内容连在一起、换行位置错乱的情况 - 每个
TimerFinished回调的入参param都是正确的,回调本身的执行逻辑没有被打乱,只是打印输出的内容发生了交错
修复方案
如果要避免打印错乱,只要给打印操作加线程锁,保证单次打印的原子性即可,修改后的代码示例:
import time import threading from TestTimerObject import TimerObject # 初始化打印专用的线程锁 print_lock = threading.Lock() def TestTimers(): timers = [] for x in range(10): new_timer_obj = TimerObject("Timer" + str(x)) new_timer_obj.timer = threading.Timer(10.0, TimerFinished, [x]) new_timer_obj.timer.start() def TimerFinished(param): # 加锁保证单次打印的内容和换行不会被其他线程打断 with print_lock: print("Finished ", param) TestTimers()
内容的提问来源于stack exchange,提问作者CosmicSeizure
相关产品推荐
相关产品推荐

