制作一个定期执行某项操作的主题就像将target
设置为类似于以下内容的函数一样简单:
minute = 60
nextTime = time.time()
while True:
Do_Some_Stuff()
nextTime += minute
sleep_time = nextTime - time.time()
if sleep_time > 0:
time.sleep(sleep_time)
但是......如果我希望另一个线程能够在某些情况下到期之前付诸行动怎么办?
我想出了以下内容:
Trigger = threading.Condition()
def loop():
while True:
Do_Some_Stuff()
with Trigger:
Trigger.wait(timeout=60)
如果我使用Thread
loop
启动target
,它将每分钟运行一次,除非我执行
Trigger.notify()
来自其他地方。然后它立即运行。有一个更好的方法吗?我玩了Semaphore
和Event
两种实现,但是一旦我异步地戳它们,它们都起飞了。
我肯定不知道的是,我可能不会只是戳它,而是在未来的某个时候戳它。 IOW,无论你目前的等待是什么,我都希望下一个等待5秒(我想我可以分叉另一个短暂的线程,延迟5秒,然后驱动Trigger)。
答案 0 :(得分:0)
以为我至少会分享我的想法。我使用了Queue
模块中的queue
。这是一些示例代码(意图以交互方式运行):
import threading
import queue
import datetime
import time
Trigger = queue.Queue()
def periodicAction():
while True:
print(datetime.datetime.now()) # arbitrary action
try:
delta = Trigger.get(timeout=20)
if delta is not None:
time.sleep(delta)
except queue.Empty:
pass
loop = threading.Thread(target=periodicAction)
loop.start()
#now dance with the user
while True:
response = input('Wakeup how soon? (Enter for immediate)')
try:
delta = float(response)
except ValueError:
delta = None
Trigger.put(delta)