TGTGInsighttelegram intelligenceLIVE / telegram public index
← Python Заметки
Python Заметки avatar

TGINSIGHT POST

Post #89

@pythonotes

Python Заметки

Прегледи550Број на прегледи
Објавено23 мај23.05.2020 г., 09:00
Содржина

Содржина на објавата

В прошлом посте мы рассмотрели синхронный планировщик задач sched. Функционал вроде не плох, но синхронное выполнение с блокировкой всё портит☹️. Можем ли мы как-то поправить ситуацию? На самом деле можем (помимо отправки всего в subprocess). Функция run() принимает аргумент blocking, который по умолчанию True. То есть, если мы укажем blocking=False то получим неблокирующее выполнение? Нет. Этот параметр работает иначе. Если мы делаем неблокирующий запуск, то после вызова метода run(blocking=False) планировщик выполнит все задачи, которым пришло время исполниться в обычном блокирующем синхронном режиме и вернёт время, через которое следует запуститься следующей задаче. То есть через какое время нужно запустить run(...) еще раз. Получается, что вместо ожидания таймаута без полезной нагрузки планировщик освобождает поток и сообщает через сколько ему пора будет продолжить работу. А что делать с этой информацией, решаете сами. Выполнение следующих задач произойдет после следующего вызова run() и если пришло их время выполниться. Например, вместо ожидания следующей задачи будем делать что-то полезное: import sched, time def func(name): # задача t = round(time.time()-start_time, 2) print(f"Execute {name} ({t}s)") start_time = time.time() # создаём планировщик s = sched.scheduler(time.time, time.sleep) s.enter(0, 1, func, argument=('ev1',)) s.enter(1, 1, func, argument=('ev2',)) s.enter(2, 1, func, argument=('ev3',)) delay = 0 last_run_time = time.time() while True: # выполнение заданий планировщика if last_run_time + delay < time.time(): delay = s.run(blocking=False) if delay is None: break last_run_time = time.time() # здесь делаем что-то полезное print('Делаем что-то полезное...') time.sleep(0.1) print('Complete all tasks') Планировщик остаётся по-прежнему синхронным, но теперь вместо бесполезного ожидания мы можем запустить другой код на исполнение и знаем когда следует вернуться к планировщику. ___________________ PPS. Да, в этих примерах я нагло использую глобальные переменные))) Не делайте так на реальных проектах