【问题标题】:How to rerun a program (while executing multiple tasks) every hour in Python?如何在 Python 中每小时重新运行一个程序(同时执行多个任务)?
【发布时间】:2019-06-30 13:53:50
【问题描述】:

我有一个主要功能,所有任务都位于其中。我要连续运行的第一个任务。我想在特定日期运行第二个任务(例如:每周一上午 12 点)。最后一个任务必须重新运行 main 函数,但要使用其他参数(我想每小时运行一次这个任务)。 我在 Ubuntu 18 上使用 Python。

我尝试使用模块“schedule”并在此处搜索堆栈溢出的答案,谷歌,......但我没有发现任何有用的东西。

import schedule, time

def main(par1, par2, par3):
    def task1():
        # Do something
        print("Executing task1")

    def task2():
        # Do something different
        print("Executing task2")

    def rerunTask():
        print("Reruning main task")
        main(1,2,3) # Rerun main function with other parameters

    schedule.every().monday.at("12:00").do(task2)
    schedule.every(0.5).seconds.do(task1)
    schedule.every().hour.do(rerunTask)

main(2,3,1)

当我尝试这段代码时,一切正常,直到“重新运行任务”。在他执行完这个任务之后,他会在剩下的时间里不断地重新运行这个函数。

有人可以帮帮我吗?

【问题讨论】:

    标签: python task schedule


    【解决方案1】:

    您可以将时间库与线程库一起使用,并根据 epochs 值执行该函数。

    警告:由于使用线程,您可能必须杀死终端才能退出。

    import time, threading
    
    def main(par1, par2, par3):
        def task1():
            # Do something
            print("Executing task1")
    
        def task2():
            # Do something different
            print("Executing task2")
    
        def run_task1():
             while(1):
                task1()
                time.sleep(0.5)
        def run_task2():
            while(1):
                task2()
                time.sleep(3600)
        def run_task3():
            week_diff = 604800
            curr_time = time.time()
            first_monday_epoch = 345600
            total_monday_crossed = int((curr_time - first_monday_epoch) / week_diff)
            next_monday = (total_monday_crossed + 1) * week_diff + first_monday_epoch
            time.sleep(next_monday - time.time())
            while(1):
                task2()
                time.sleep(604800) #week time difference
    
        t1 = threading.Thread(target=run_task1, args=())
        t2 = threading.Thread(target=run_task2, args=())
        t3 = threading.Thread(target=run_task3, args=())
        t1.start()
        t2.start()
        t3.start()
        t1.join()
        t2.join()
        t3.join()
    
    main(2,3,1)
    

    注意:我使用Epoch converter 来计算第一个星期一上午 00:00 的纪元和其他纪元信息。

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多