Python выполнить задачу, если время сейчас находится в массиве времени - PullRequest
1 голос
/ 20 марта 2020

У меня есть массив времен как таковой:

array_of_times = ['2020-03-20 16:05:30', '2020-03-20 16:20:30', '2020-03-20 16:27:30', '2020-03-20 16:30:30', '2020-03-20 16:40:30', '2020-03-20 16:55:30', '2020-03-20 17:00:30', '2020-03-20 17:04:30', '2020-03-20 17:05:30', '2020-03-20 17:15:30', '2020-03-20 17:30:30', '2020-03-20 17:35:30', '2020-03-20 17:42:30', '2020-03-20 17:45:30', '2020-03-20 17:55:30', '2020-03-20 18:00:30', '2020-03-20 18:15:30', '2020-03-20 18:25:30', '2020-03-20 18:30:30', '2020-03-20 18:45:30', '2020-03-20 18:55:30', '2020-03-20 19:00:30', '2020-03-20 19:15:30', '2020-03-20 19:25:30', '2020-03-20 19:30:30', '2020-03-20 19:45:30', '2020-03-20 19:55:30', '2020-03-20 20:00:30', '2020-03-20 20:15:30', '2020-03-20 20:25:30', '2020-03-20 20:30:30', '2020-03-20 20:45:30', '2020-03-20 21:00:30', '2020-03-20 21:15:30', '2020-03-20 21:45:30', '2020-03-20 22:15:30']

И мне было интересно, есть ли способ в python проверить, есть ли текущее время в массиве, и если это так, завершить задачу

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

Я пробовал простые решения, такие как:

now = str(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

while True:
    if now in array_of_times:
        print("Time is in")

Однако он никогда не оценивался как истинный для оператора if, даже если прошло правильное время.

Я также пытался использовать:

for z in array_of_times:
    schedule.every().day.at(z).do(execute_task)
#given z was in the correct format

Однако, все равно не повезло.

Любая поддержка приветствуется. Спасибо

1 Ответ

1 голос
/ 20 марта 2020

Одним из решений является исправление назначения «сейчас». Чтобы проверить, находится ли ваше время в массиве, вы должны обновить 'now' в l oop.

while True:
    now = str(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    if now in array_of_times:
        print("Time is in")

Требуется относительно много времени, чтобы определить, находится ли текущее время в вашем массиве. так что не стоит делать что-то подобное со списком раз:

if now in array_of_times

Это потому, что он будет искать каждое значение в массиве, по одному за раз.

Следовательно, лучшее решение - установить набор времени, так как хеширование ускорит время, чтобы определить, находится ли время в массиве. Поэтому определите ваш массив следующим образом:

set_of_times = set(['2020-03-20 16:05:30', '2020-03-20 16:20:30', '2020-03-20 16:27:30', '2020-03-20 16:30:30', '2020-03-20 16:40:30', '2020-03-20 16:55:30', '2020-03-20 17:00:30', '2020-03-20 17:04:30', '2020-03-20 17:05:30', '2020-03-20 17:15:30', '2020-03-20 17:30:30', '2020-03-20 17:35:30', '2020-03-20 17:42:30', '2020-03-20 17:45:30', '2020-03-20 17:55:30', '2020-03-20 18:00:30', '2020-03-20 18:15:30', '2020-03-20 18:25:30', '2020-03-20 18:30:30', '2020-03-20 18:45:30', '2020-03-20 18:55:30', '2020-03-20 19:00:30', '2020-03-20 19:15:30', '2020-03-20 19:25:30', '2020-03-20 19:30:30', '2020-03-20 19:45:30', '2020-03-20 19:55:30', '2020-03-20 20:00:30', '2020-03-20 20:15:30', '2020-03-20 20:25:30', '2020-03-20 20:30:30', '2020-03-20 20:45:30', '2020-03-20 21:00:30', '2020-03-20 21:15:30', '2020-03-20 21:45:30', '2020-03-20 22:15:30'])

Третье альтернативное решение - если вы хотите минимизировать объем работы, выполняемой сервером, сначала отсортируйте список раз, посмотрите, как долго это займет, чтобы достигнуть в следующий раз, и использовать time.sleep, чтобы ждать. Python time.sleep не занят ожиданием, поэтому вы освобождаете свой процессор.

from datetime import datetime
import time

array_of_times = ['2020-03-19 22:34:00']
array_of_times.sort()

while True:
    if not array_of_times:
        print("No more times in array.")
        break
    next_time_string = array_of_times[0]
    next_time = datetime.strptime(next_time_string, "%Y-%m-%d %H:%M:%S")  # get the datetime from the date
    del array_of_times[0]  # remove the first date
    time.sleep((next_time - datetime.now()).total_seconds())
    # do action
    print("I reached time:", next_time_string)

Вывод этого кода:

$ python test2.py
I reached time: 2020-03-19 22:34:00
No more times in array.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...