定期python线程,可以异步戳入操作

时间:2014-01-28 23:29:53

标签: python multithreading asynchronous python-3.x

制作一个定期执行某项操作的主题就像将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()

来自其他地方。然后它立即运行。有一个更好的方法吗?我玩了SemaphoreEvent两种实现,但是一旦我异步地戳它们,它们都起飞了。

我肯定不知道的是,我可能不会只是戳它,而是在未来的某个时候戳它。 IOW,无论你目前的等待是什么,我都希望下一个等待5秒(我想我可以分叉另一个短暂的线程,延迟5秒,然后驱动Trigger)。

1 个答案:

答案 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)