如果我打电话
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(...)不会重复使用线程,但每次都会创建一个新线程。
结合我们使用的库不是线程安全的信念,这些错误会有所帮助....
答案 0 :(得分:3)
正确:每次调用Timer
都会启动一个新线程。实际上,类threading.Timer
被记录为是“一个线程”。您可以通过阅读the source code,第707行来确认这一点。
一个很好的选择是在单个线程中运行scheduler,通过Queue.Queue
实例接收请求(本质上是线程安全的)并且本质上将它们序列化(这也可能会处理你的“非线程”) -safe-library“问题,无需进一步锁定或同步,具体取决于您如何安排整体架构。”