是否存在无阻塞方式等待或在扭曲状态下返回此功能?
我有一个循环自动收录器,它在设定的时间间隔内设置为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
然后再回来停止它。
我不要想要在此操作期间阻止循环。我怎么能这样做?
答案 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
。