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 - это количество рабочих, которые будут порождены не более . Самое большее ключевое слово, которое, по моему мнению, не должно появляться больше, чем необходимо.