Python schedule how to

Задачка на вечер:

Дано: задание, которое нужно выполнять в заданные промежутки времени, модуль Python schedule.

Задача: запускать одну и ту же задачу с разными значениями offset раз в 10 сек, так, чтобы 0ffset=119 запускался в 10 сек от начала каждой минуты, offset=219 на 20й секунде каждой минуты и так далее.

Все что пока смог сделать — заставить выполняться задачу каждую 10ю секунду, НО! это грозит тем, что каждые 10 сек в очередь добавляется каждая след. задача, так что может выполняться все куда чаще, чем раз в 10 сек.
Есть идея — сделать задержку в 10 сек после каждого добавления задачи в очередь, тогда может получиться задержка в 20 сек, потом выполнение подряд нескольких задач, и снова 20 сек задержки.

Сломал голову себе, сломаю и вам.

Говнокодь
@
Быстроотвечай

Вариант 1

Делаем счетчик временной паузы в цикле + 5, так после каждого выполнения скрипт будет ждать на 5 сек больше от прошлого выполнения.

Задача будет выполняться таким образом, раз в каждые 5, 15, 25, 35, 45 и т.д. секунд, при этом никогда не будет возникать ситуация, когда в очереди накопится сразу несколько задач с интервалов в 1 сек!
Ееее, велосипед!

Лог выполнения:

Вариант 2

Задать кроме того, таким же образом значение every в моменте добавления функции в очередь.

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

Вариант 3

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

Вариант 4

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

Вот окончательный вариант без велосипеда:

Лог также работает как в варианте 1, но только не нагружает бредом модуль scheduled, который функционально для других целей вообще служит.

Но все равно это все херня, и сейчас я объясню почему:

  • во-первых, модуль scheduler выполняет все «джобы» строго по порядку-очереди, таким образом, пока выполняется «долгая» задача, которая занимает, например 5 минут времени, другая задача, которая выполняется каждые 30 сек — будет стоять в очереди, пока 5минтка не закончится, и потом выполнится столько раз, раз в 30 сек, сколько будет свободно до следующей «джобы» на 5 минут, все это создает задержки, которые в конце-концов из-за путаницы могут суммироваться и достигать часов;
  • во-вторых, если запустить несколько «джоб» параллельно, благо модуль это позволяет, можно попасть в ловушку Вконтакта, которая запрещает выполнять более 25 запросов (при условии использования vk execute) — за одну секунду, таким образом, две параллельные «джобы» будут конкурировать и блокировать друг-друга с периодичностью раз в 5 мин, что в итоге может просто-напросто вырубить одну из функций так, как будто бы она и не исполнялась, что равносильно первому варианту с очередью, в сухом остатке.

Что имеем на выходе?

Нужен вариант, когда функция, которая выполняется раз в 30 сек, выполнялась как можно чаще, но в промежутках была возможность вставить части более долгой функции, например, короткая функция выполняется на 30-й секунде, завершает работу на 45й а с 45й до следующей 30й будет выполняться часть долгой функции.

Ну или тот вариант, когда функция выполняется постепенно в разные промежутки: часть в 5 мин, часть в 10, 20, 30 и т.п. Так получится совместить выполнение быстрой функции, которая должна работать регулярно, и долгой функции, которая будет запускаться редко, и удалять комментарии «в глубь» то есть со сдвигом до тысячных постов.

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

trianglesis

Об авторе trianglesis

Александр Брюндтзвельт - гений, филантроп, 100 гривен в кармане. Этот блог - "сток" моих мыслей и заметок. Достаточно одного взгляда на него, чтобы понять, что такой же бардак творится у меня в голове. Если вам этот бардак интересен - милости прошу.
Закладка Постоянная ссылка.