Как перезапустить программу (при выполнении нескольких задач) каждый час в Python? - PullRequest
0 голосов
/ 30 июня 2019

У меня есть основная функция, где расположены все задачи. Первую задачу я хочу запустить непрерывно. Второе задание, которое я хочу выполнить в определенный день (например, каждый понедельник в 12:00). Последняя задача должна перезапустить основную функцию, но с другими параметрами (я хочу запускать эту задачу каждый час). Я использую Python на Ubuntu 18.

Я пытался использовать модуль ' schedule ' и искал ответ здесь о переполнении стека, Google, ... но я не нашел ничего полезного.

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)

Когда я попробовал этот код, все работало нормально до «повторного запуска задачи». После выполнения этой задачи он непрерывно перезапускает эту функцию до конца.

Может кто-нибудь помочь мне?

1 Ответ

1 голос
/ 30 июня 2019

Вы можете использовать библиотеку времени с библиотекой потоков и на основе значения эпох, функция будет выполнена.

Предупреждение: из-за использования потока вам может потребоваться прервать терминал для выхода.

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)

Примечание. Я использовал Преобразователь эпох для расчета периода первого понедельника 00:00 и другой информации об эпохе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...