【问题标题】:How does Timer in Python work, regarding multithreading?关于多线程,Python 中的 Timer 是如何工作的?
【发布时间】:2010-01-23 20:19:37
【问题描述】:

如果我打电话

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

结合我们使用的库不是线程安全的信念,这些错误是有道理的......

【问题讨论】:

    标签: python multithreading


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-05-28
      • 2023-03-24
      • 2023-03-20
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      相关资源
      最近更新 更多