планировщик python в цикле for

#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 — лучший способ сделать это, но он выполнит свою работу.