我已经看到,通过使用事件循环库,我可以每 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:00、晚上 11:45:00 等等。
我怎样才能达到这个结果?
使用时间表。
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()
精确为 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
因此它检查是否有新的分钟并再次调用日期时间函数。延迟约为0.2毫秒。
如果您按照永远运行的程序的思路思考,则必须使用类似
now = datetime.now()
的内容来 ping 系统时间。现在,如果您希望以 1 秒的精度捕获该 :00
窗口,这意味着您必须更频繁地执行 ping 操作。
通常更好的方法是在 Linux 系统中使用 Windows 任务计划程序或 Crontab 来安排脚本执行。
例如,这应该运行每个
XX:YY:00
:
* * * * * python run_script.py