Python中的计时器在多线程中如何工作?

1 投票
1 回答
2126 浏览
提问于 2025-04-15 18:23

如果我多次调用

Timer(.1, some_function, [some_arguments]).start()

背后到底发生了什么呢?

我们问题的根源是……

我们有一个方法,基本上是这样的:

def move(target):
 force = calculateForce(target-getCurrentPosition())
 if(force != 0)
   setForce(force)
   Timer(.1, moveCursor, [tx]).start()
 else:
   setForce(0)

在设置了强制执行后,我们需要在一段时间后检查一下是否应该停止。(这个信息是来自一个外部的物理设备,它不会主动发送事件。)

这个函数的执行时间有些奇怪,而且在一段时间后我们还会遇到“无法启动新线程”的错误。

这让我相信 Timer(...) 并不是重用线程,而是每次都创建一个新的线程。

再加上我认为我们使用的库不是线程安全的,这些错误就有点道理了……

1 个回答

3

没错,每次调用 Timer 确实会启动一个新的线程。实际上,threading.Timer 类被说明为“一个线程”。你可以通过查看 源代码,第707行来确认这一点。

一个不错的替代方案是使用一个 调度器,它在一个线程中运行,通过一个 Queue.Queue 实例接收请求(这个队列本身是线程安全的),并且能够自动按顺序处理这些请求(这也可能解决你“非线程安全库”的问题,而不需要额外的锁或同步,当然这要看你整体架构的安排)。

撰写回答