可以异步触发的周期性python线程

2024-04-24 10:14:31 发布

您现在位置:Python中文网/ 问答频道 /正文

创建一个周期性执行某项任务的线程非常简单,只需将其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,而looptarget,它每分钟运行一次,除非我执行

Trigger.notify()

从别处来的。然后它就跑了。有没有更好的办法?我同时使用了SemaphoreEvent实现,但是当我异步戳它们时,它们都起飞了。你知道吗

而真正让我困惑的是,我可能不只是戳它,而是戳它在未来的某个时刻。瞧,不管你现在在等什么,我希望下一个是5秒后的(我想我可以分叉另一个短生命线程,延迟5秒,然后驱动触发器)。你知道吗


Tags: 函数looptruetargettimesleepsome线程
1条回答
网友
1楼 · 发布于 2024-04-24 10:14:31

我想我至少应该分享一下我的想法。我使用了来自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)

相关问题 更多 >