Планировщик Python не запускает функцию, запланированную при импорте - PullRequest
1 голос
/ 14 апреля 2019

Задача

Когда этот блок кода:

# main.py - this file gets run directly.
import sched
import time
scheduler = sched.scheduler(time.time, time.sleep)

print("before definition")

def do_something():
    print("do_something is being executed.")
    scheduler.enter(1, 5, do_something)

print("post definition")
scheduler.enter(1, 5, do_something)

# Do something, so that the program does not terminate.
do_not_terminate()

находится в вызываемом файле ( main.py ), он работает как положено (с функцией do_something, запускаемой каждую секунду.), Получая следующий вывод:

before definition
post definition
do_something is being executed.
do_something is being executed.
do_something is being executed.
do_something is being executed.
do_something is being executed.
do_something is being executed.
...

Но:

когда указанный выше блок помещается в отдельный файл ( someimport.py ) и someimport.py импортируется в main.py функции do_something no дольше исполняется. [Код выглядит так:]

# someimport.py - this file gets imported in main.py
import sched
import time
scheduler = sched.scheduler(time.time, time.sleep)

print("before definition")

def do_something():
    print("do_something is being executed.")
    scheduler.enter(1, 5, do_something)

print("post definition")
scheduler.enter(1, 5, do_something)

# main.py - this file get's run directly
import someimport

# Do something, so that the program does not terminate.
do_not_terminate()

Производятся только следующие выходные данные (и, конечно, сообщения об ошибках не появляются):

before definition
post definition

Я уже пробовал следующее:

1. Переключите import someimport на from someimport import * in main.py

Это, как и ожидалось, ничего не изменило.

2. Поместите первый вызов scheduler.enter в отдельную функцию ( run ), которая вызывается после импорта:
# someimport.py - this file gets imported in main.py
import sched
import time
scheduler = sched.scheduler(time.time, time.sleep)

print("before definition")

def do_something():
    print("do_something is being executed.")
    scheduler.enter(1, 5, do_something)

print("post definition")
def run():
    scheduler.enter(1, 5, do_something)

# main.py - this file get's run directly
import someimport

someimport.run()

# Do something, so that the program does not terminate.
do_not_terminate()

Это ничего не изменило.

3. импортировать sched и время в main.py , а также.

Как и ожидалось, это также не имело никакого эффекта.

Есть ли способ запланировать функцию do_something в someimport.py , без первого scheduler.enter в файле main.py. Это то, чего я стараюсь избегать (так как в реальном проекте примерно 100 запланированных задач, подобных этой, и я пытаюсь очистить основной файл).

Весь приведенный выше код был протестирован на python 3.7.3 под GNU / Linux.

Заранее большое спасибо!

1 Ответ

0 голосов
/ 14 апреля 2019

Мне удалось заставить работать ваш отдельный пример модуля, вызвав run() для экземпляра scheduler после его импорта в main.py.

# main.py - this file get's run directly
import someimport

someimport.scheduler.run()  # Blocks until all events finished

Производит:

before definition
post definition
do_something is being executed.
do_something is being executed.

Согласно документы , scheduler.run() должны вызываться для запуска любых запланированных задач.Сам метод scheduler.enter() будет только планировать события, а не запускать их.

...