在每个系统时钟分钟重复 python 函数

Repeat python function at every system clock minute

我发现我可以使用事件循环库 in this post:

每 x 秒重复一个函数 python
import sched, time
s = sched.scheduler(time.time, time.sleep)
def do_something(sc): 
    print("Doing stuff...")
    # do your stuff
    s.enter(60, 1, do_something, (sc,))

s.enter(60, 1, do_something, (s,))
s.run()

但我需要一些稍微不同的东西:我需要在每个系统时钟分钟调用该函数:在 11:44:00PM、11:45:00PM 等等。

我怎样才能达到这个结果?

如果您按照永远 运行ning 程序的思路思考,则必须使用 now = datetime.now() 之类的方法来 ping 系统时间。现在,如果您想要 1 秒的准确度来捕获 :00 window,这意味着您必须更频繁地执行 ping。

通常更好的方法是在 Linux 系统中使用 Windows Task Scheduler 或 Crontab 在外部安排脚本执行。

例如,这应该 运行 每 XX:YY:00:

* * * * * python run_script.py

很难做到精确到 0(因为总会有一点延迟),但您可以检查分钟是否已更改:

import datetime
minute = None
while True:
    if datetime.datetime.now().minute != minute:
        print(f'Do something {datetime.datetime.now()}')
        minute = datetime.datetime.now().minute 

我机器上的结果:

Do something 2022-01-21 11:24:39.393919
Do something 2022-01-21 11:25:00.000208

因此它检查是否有新的分钟并再次调用 datetime 函数。延迟大约为 0.2 毫秒。

使用schedule.

import schedule
import time

schedule.every().minute.at(':00').do(do_something, sc)
while True:
    schedule.run_pending()
    time.sleep(.1)

如果 do_something 花费超过一分钟,在将其传递给 do 之前对其进行线程化处理。

import threading
def do_something_threaded(sc):
    threading.Thread(target=do_something, args=(sc,)).start()