一种无阻塞的睡眠/等待方式?

时间:2016-01-11 19:02:54

标签: python python-2.7 twisted

是否存在无阻塞方式等待或在扭曲状态下返回此功能?

我有一个循环自动收录器,它在设定的时间间隔内设置为tick,这一切都很有效。但是,当我停止它时,我想确保它目前不在Tick做任何工作。如果它是我只是想扭曲回来并在一瞬间杀死它。

def stop(self):
    import time
    while self.in_tick:
        time.sleep(.001) # Blocking
    self.active = False
    self.reset()
    self.timer.stop()

有时上面这个函数被调用,而另一个线程正在运行Tick操作,我想完成Tick然后再回来停止它。

不要想要在此操作期间阻止循环。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

执行time.sleep()看起来有点奇怪,而不是仅仅等待事件发出信号并触发延迟来执行您想要的操作。使用线程你可能会唤醒这个线程,检查'self.in_tick == False',在你达到'self.active = False'之前,另一个线程开始新的tick,所以这可能有一个竞争条件,可能无法工作无论如何,你期待。所以希望你在其他地方有一些其他的线程同步来使它工作。

您可以尝试将代码拆分为两个函数,如果没有完成,可以自行安排一个函数。

def stop(self):
    # avoid reentracy
    if not self._stop_call_running:
        self._stop()

def _stop(self):
    if self.in_tick:
       # reschedule itself
       self._stop_call_running = reactor.callLater(0.001, self._stop)
       return
    self.active = False
    self.reset()
    self.timer.stop()
    self._stop_call_running = None

您也可以查看twisted.internet.task.LoopingCall