#python #loops #scheduler
#python #циклы #планировщик
Вопрос:
Я пытался выяснить, могу ли я использовать модуль python schedule
для упорядочивания приема данных в базу данных путем перебора строк в файле и, например, каждые 10-секундные интервалы отправки следующей строки данных из входного файла в базу данных. Я еще не смог этого достичь и поэтому попытался заставить принцип работать над более простой проблемой. Я ни в коем случае не опытный программист
Если я запускаю приведенный ниже код с t1
комментарием, я передаю список чисел через две функции, и код генерирует ожидаемый результат умножения каждого значения в списке на два.
import schedule
import time
def the_calc(i):
j = i * 2
print(j)
return j
def gen_newlist(list):
newer_list = []
print(list)
for i in list:
## t1
# res = schedule.every(10).seconds.do(the_calc, i)
# newer_list.append(res)
# while True:
# schedule.run_pending()
# time.sleep(1)
## t2
res = the_calc(i)
newer_list.append(res)
return newer_list
if __name__ == '__main__':
list = [2, 4, 6, 8, 10]
new_list = gen_newlist(list)
print(new_list)
Если я закомментирую t2
и раскомментирую код в t1
, который включает синтаксис, который я считаю правильным для schedule
модуля, я надеялся, что каждое число во входном списке снова будет умножено на 2, но с интервалом в 10 секунд.
Фактически, список обрабатывается с интервалом в 10 секунд, но кажется, что только первое значение в списке повторно выбирается и передается the_calc
функции, в результате чего значение выводится на консоль и, кроме того, не останавливается после 5 итераций, что соответствует длине списка.
Вероятно, это простое упущение или ошибка в моем коде, и я надеюсь, что кто-нибудь сможет указать мне правильное направление.
Комментарии:
1. Почему бы вам просто не использовать
t2
раздел сtime.sleep(10)
?2. Это даже не приходило мне в голову. Я только что поместил ‘time.sleep(10)’ над ‘res=the_calc(i)’, и код выполнил то, на что я надеялся .. без вызова модуля расписания .. Спасибо
Ответ №1:
Смотрите эту строку:
schedule.every(10).seconds.do(the_calc, i)
а теперь давайте попробуем понять, что делает эта строка.
Эта строка сообщает планировщику, что пользователь хочет вызывать функцию the_calc
со значением i
каждые 10 секунд. Итак, он продолжает делать одно и то же каждые 10 секунд и никогда не выходит из while
цикла, и именно поэтому он никогда не достигает второго значения списка.
Я не знаком с schedule
модулем, поэтому я не знаю, как это сделать с помощью этого модуля, но вы можете использовать time.sleep
для этого. Кроме того, вы можете использовать threading
с этим, если вы не хотите блокировать основной поток. Спасибо. Пожалуйста, прокомментируйте, если у вас есть какие-либо сомнения.
Комментарии:
1. Теперь я вижу проблему в том, что я не выхожу из цикла. Мне нужно будет выяснить, как это сделать, и перейти к следующему i. Опция в комментарии выше и то, что вы упоминаете об использовании time.sleep, похоже, работает, размещена в
t2
разделе2. Рад, что это помогло. Я не уверен, что использование
time.sleep
— лучший способ сделать это, но он выполнит свою работу.