关于多线程,Timer中的Timer如何工作?

时间:2010-01-23 20:19:38

标签: python multithreading

如果我打电话

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 个答案:

答案 0 :(得分:3)

正确:每次调用Timer都会启动一个新线程。实际上,类threading.Timer记录为是“一个线程”。您可以通过阅读the source code,第707行来确认这一点。

一个很好的选择是在单个线程中运行scheduler,通过Queue.Queue实例接收请求(本质上是线程安全的)并且本质上将它们序列化(这也可能会处理你的“非线程”) -safe-library“问题,无需进一步锁定或同步,具体取决于您如何安排整体架构。”