Решение для успешного запуска программы на python, использующей pythons multiprocessing
lib, состоит в том, чтобы принудительно запустить ее в режиме fork. PM2, если не указано иное, автоматически пытается запустить его в режиме кластера.
Однако, я подозреваю, нам нужно полностью оставить многопроцессорную часть на python. Я не могу представить, чтобы PM2 мог управлять несколькими процессами, порождаемыми многопроцессорностью Python.
Я запускаю процесс с pipenv
, поэтому вот мой соответствующий файл pm2.config.json :
{
"apps": [{
"name": "BackupService",
"script": "/home/service-backup/service/server.py",
"args": [""],
"exec_mode": "fork",
"wait_ready": true,
"autorestart": false,
"max_restarts": 5,
"interpreter" : "pipenv",
"interpreter_args": "run python3"
}]
}
Важная часть здесь "exec_mode": "fork"
Тогда pm2 start pm2.config.json
. Я всегда pm2 delete BackupService
(или как вы называете это в «имя»), прежде чем начать снова, потому что даже с флагом --update-env
он не использует обновленный pm2.config.json. Не знаю почему.
Если вы не используете файл pm2.config.json, то (я думаю) вы можете форсировать режим форка, передав флаг -i 0
запуску pm2. Если кто-нибудь сможет проверить и подтвердить это, я бы хотел обновить это, чтобы сделать определенное утверждение.