Запуск функции в определенное время с использованием python

#python #datetime

#python #datetime

Вопрос:

Я пытаюсь запустить функцию один раз в определенное время. Я использовал свой код следующим образом:

 import pytz
import datetime
import time

def test_1():

    print("Working_1")


def test_2():

    print("Working_2")


while True:

    current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M:%SZ')

    if current_time == '2019-03-18T19:00:36Z':

        test_1()

        current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M:%SZ')


        if current_time > '2019-03-18T19:00:36Z':

            break

        if current_time == '2019-03-18T19:00:36Z':

            test_2()


            current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M:%SZ')


            if current_time > '2019-03-18T19:00:36Z':

                break
  

Когда я запускаю свой код, он запускает первую функцию, за которой следует вторая, до выполнения конечного условия.

Я хочу, чтобы функция выполнялась в указанное время в if инструкции.

Я думаю, что проблема возникает из-за того, как циклы являются вложенными. Я пробовал несколько конфигураций if инструкции и условия прерывания, но просто не могу ее получить.

Любая помощь была бы высоко оценена, приветствия. Сэнди

Комментарии:

1. почему в вашем коде двойной интервал ..?

2. Я просто считаю, что это немного легче читать.

3. В чем проблема с вашим кодом? Почему это не оправдало ожиданий?

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

5. Все четыре ваших if оператора сравниваются с одним и тем же временем. Из вашего поста я понял, что вы хотите, чтобы что-то происходило в разное время. Я бы начал с этого.

Ответ №1:

Я полагаю, что ваш код здесь не работает, потому что для этого потребовалось бы, чтобы время точно соответствовало заданной временной метке, а при учете времени выполнения, даже минимального, это совершенно нереально. Возможным решением является предоставление «временной подушки», то есть окна вокруг времени выполнения, а не точного соответствия для оператора if; однако это все еще довольно ненадежно.

Если вы не возражаете против использования внешнего модуля, я бы порекомендовал вам взглянуть на sched или APScheduler. Я лично использовал последнее, и оно отлично работает.

Ответ №2:

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

 current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M:%SZ')
while current_time < '2019-03-18T19:00:36Z':
    current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M:%SZ')
test_1()
test_2()
  

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

РЕДАКТИРОВАТЬ: Если вы хотите, чтобы они запускались в два разных времени:

 current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M:%SZ')
while current_time < '<first_time>':
    current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M:%SZ')
test_1()
while current_time < '<second_time>':
    current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M:%SZ')
test_2()
  

(где <first_time> это первое в хронологическом порядке)

Комментарии:

1. Current_time можно сравнить '2019-03-18T18:35:36Z' > '2019-03-18T18:34:36Z' возвращает true

2. Что, если я хочу, чтобы функции запускались в определенное время. Возможно, этот код поможет вам понять мой вопрос def time(): current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M') while current_time == '2019-03-18T19:37': current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M') test_1() while current_time == '2019-03-18T19:38': current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M') test_2()