Как сделать так, чтобы APScheduler ProcessPoolExecutor закрывал процесс по завершении и выполнял только те процессы, которые ему нужны? - PullRequest
0 голосов
/ 11 октября 2019

ProcessPoolExecutor порождает множество процессов, которые обрабатывают задания apscheduler. Я ожидаю, что процессы, порожденные ProcessPoolExecutor, будут фактически остановлены после успешного завершения задания, а новый процесс будет создан для следующего выполнения указанного задания. Я также ожидаю не порождать процессы, если в этом нет необходимости. Однако этого не происходит. Если я установлю максимальное количество рабочих на 10, будет запущено 10 процессов. Даже если у единственного задания max_instances равно 3. После того, как один из процессов завершит задание, этот процесс не восстанавливается и просто перенаправляется для следующего запуска указанного задания.

Я приведу пример:

Создайте apscheduler, используя BlockingScheduler, используя ProcessPoolExecutor в качестве исполнителя.

def printing_job():
    print("print this...")

def main():
    executors = {
        'default': ProcessPoolExecutor(max_workers=10)
    }
    job_defaults = {
        'coalesce': False,
        'max_instances': 3,
        'misfire_grace_time': None
    }
    scheduler = BlockingScheduler(executors=executors,
                                  daemonic=True,
                                  daemon=True)
    scheduler.add_job(printing_job, 'interval', seconds=1)
    scheduler.start()

11 процессов, 10 процессов планировщика и основныхпроцесс:

user   61428  59435 18 16:25 pts/2    00:00:00 ../bin/python3 ./test.py
user   61456  61428  0 16:25 pts/2    00:00:00 ../bin/python3 ./test.py
user   61457  61428  0 16:25 pts/2    00:00:00 ../bin/python3 ./test.py
user   61458  61428  0 16:25 pts/2    00:00:00 ../bin/python3 ./test.py
user   61459  61428  0 16:25 pts/2    00:00:00 ../bin/python3 ./test.py
user   61460  61428  0 16:25 pts/2    00:00:00 ../bin/python3 ./test.py
user   61461  61428  0 16:25 pts/2    00:00:00 ../bin/python3 ./test.py
user   61462  61428  0 16:25 pts/2    00:00:00 ../bin/python3 ./test.py
user   61463  61428  0 16:25 pts/2    00:00:00 ../bin/python3 ./test.py
user   61464  61428  0 16:25 pts/2    00:00:00 ../bin/python3 ./test.py
user   61465  61428  0 16:25 pts/2    00:00:00 ../bin/python3 ./test.py

Только 3 используются заданием. Я должен увидеть максимум 4 процесса. Процессы следует пожинать и заново создавать.

Эта парадигма невозможна в APScheduler?

ProcessPoolExecutor утверждает, что max_workers - это количество рабочих, которые будут порождены не более . Самое большее ключевое слово, которое, по моему мнению, не должно появляться больше, чем необходимо.

...