Python - Как заставить pm2 работать с многопроцессорностью? - PullRequest
0 голосов
/ 15 ноября 2018

Итак, я обнаружил новую проблему, связанную с pm2 (pm2.keymetrics.io/) - поэтому я пытался выяснить, почему мои сценарии не работают с pm2

(Что я имею в виду под pm2, так это то, что всякий раз, когда вы работаете с многопроцессорной обработкой, он создает python.exe и открывает его отдельно от PM2 Dashbord, как на картинке здесь Picture)

Так что вопрос в том, как я могу сделать так, чтобы она работала на приборной панели Pm2.

Я сделал небольшой небольшой скрипт для тех, кто хочет проверить его с pm2.

import multiprocessing, time, os, sys, threading
from utils import Logger

Checker = ['Helloworld']
logger = Logger()  # Logger from Utils

def test(findings):
    while True:

        logger.log("ping")
        time.sleep(1)


def main():

    try:
        jobs = []
        for finding in Checker:
            p = multiprocessing.Process(target=test, args=(finding ,))
            jobs.append(p)
            p.start()


    except KeyboardInterrupt:
        print('Keyboard - Interrupted')
        sys.exit()


if __name__ == '__main__':
    try:
        main()

    except KeyboardInterrupt:
        print('Keyboard - Interrupted')
        sys.exit()

1 Ответ

0 голосов
/ 02 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...