代码之家  ›  专栏  ›  技术社区  ›  Jepessen

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

  •  1
  • Jepessen  · 技术社区  · 4 年前

    我已经看到,通过使用事件循环库,我可以每隔x秒用python重复一个函数 in this post :

    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等等。

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

    3 回复  |  直到 4 年前
        1
  •  6
  •   timgeb    4 年前

    使用 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()
    
        2
  •  1
  •   3dSpatialUser    4 年前

    精确的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 
    

    在我的mahcine上的结果:

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

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

        3
  •  1
  •   Register Sole    4 年前

    如果你按照一个永远运行的程序的思路思考,你必须使用类似的东西来ping系统时间 now = datetime.now() 。现在,如果你想要1秒的准确度来捕捉它 :00 window,这意味着你必须更频繁地ping。

    通常,更好的方法是在Linux系统中使用Windows任务调度器或Crontab在外部调度脚本执行。

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

    * * * * * python run_script.py