На самом деле можем (помимо отправки всего в 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. Да, в этих примерах я нагло использую глобальные переменные))) Не делайте так на реальных проектах