将事件添加到 运行 sched.scheduler

Adding an event to a running sched.scheduler

此代码应创建一个执行 sched.scheduler.run() 的线程,然后在未来 5 秒内安排一个事件。但是,在 macOS Catalina 的 Python 3.7.4 上,计划的事件回调不会 运行。

您是否可以在 运行 宁 sched.scheduler 安排活动?我假设你可以,因为你被允许取消排队的事件,并且没有抛出异常。

import datetime
import sched
import threading
import time


class Schedule:
    def __init__(self):
        self.scheduler = sched.scheduler(time.time, time.sleep)
        self.thread = threading.Thread(target=self.scheduler.run)
        self.thread.start()

    def at(self, when, callback, *args, **kwargs):
        e = self.scheduler.enterabs(when.timestamp(), 0, callback, args, kwargs)
        return e


target = (datetime.datetime.now() + datetime.timedelta(seconds=5))

s = Schedule()
s.at(target, print, 'Ding!')

while True:
    print(time.time() - target.timestamp(), s.scheduler.queue)
    time.sleep(1)

根据文档https://docs.python.org/3/library/sched.html

run 不会执行您期望的无限循环操作。它消耗队列并且没有进一步的事件然后它 returns。因此,如果 运行 在 'Ding' 排队之前执行,'Ding' 将排在队列中直到天

结束