2010-01-23 41 views
1

如果我打电话Python中的Timer如何工作,关于多线程?

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(...)不会重用线程,但每次都会创建一个新线程。

与信念,我们正在使用的库不是线程安全相结合,这些错误会使得一些感觉....

回答

3

右:每次调用Timer并启动一个新的线程。的确,类threading.Timer记录为为“一个线程”。您可以通过阅读the source code证实了这一点,线707

一个很好的替代方案是在单个线程中运行scheduler,通过Queue.Queue实例(本线程)接收请求和本质它们序列化(也可以照顾你“非线程安全库”问题,而不需要进一步的锁定或同步,这取决于你如何安排你的整体架构)。