Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于多线程,Python中的计时器是如何工作的?_Python_Multithreading - Fatal编程技术网

关于多线程,Python中的计时器是如何工作的?

关于多线程,Python中的计时器是如何工作的?,python,multithreading,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: s

如果我打电话

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)
设置力后,我们需要在一定时间后检查是否应该停止。(此信息发送到/来自不触发事件的外部物理设备。)

这个函数花费了多少时间,这是一个奇怪的问题,而且在一段时间后,我们会遇到“无法启动新线程”错误

这让我相信计时器(…)不会重用线程,而是每次都创建一个新线程


再加上我们所使用的库不是线程安全的,这些错误会有一定的意义……

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

一个好的替代方法是在单个线程中运行,通过
队列接收请求。队列
实例(本质上是线程安全的)并本质上序列化它们(这也可以处理“非线程安全库”不需要进一步锁定或同步的问题(当然,这取决于您如何安排总体架构)