Python - 如何使 pm2 与多进程一起工作?

Python - How to make pm2 working with multiprocessing?

所以我发现了关于 pm2 的新问题 (pm2.keymetrics.io/) - 所以我一直在努力弄清楚为什么我的脚本不能与 pm2 一起工作

(我所说的 pm2 的意思是,每当您 运行 使用多处理时,它都会创建一个 python.exe 并将其与 PM2 Dashbord 分开打开,如图所示 )

所以问题是我怎样才能让它适用于 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()

成功运行一个使用pythons multiprocessing lib 的python 程序的解决方案是强制运行在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(或者你在 "name" 中怎么称呼它),因为即使使用 --update-env 标志,它也不会使用更新的 pm2.config.json。不知道为什么。

如果你使用pm2.config.json文件那么(我认为)你可以通过将-i 0标志传递给pm2启动来强制fork模式。如果有人可以测试并确认这一点,我想更新它以做出一定的声明。

这是我的 PM2 设置,Python 多处理:

// ecosystem.config.js generated using `pm2 ecosystem`

module.exports = {
  apps : [
    {
      "name": "<Your_Service_Name>",
      "cwd": "C:<Your_Working_Directory>",
      "script": "./app.py",
      "exec_mode": "fork_mode",
      "wait_ready": true,
      "exec_interpreter" : "C:<Your_Path_To_venv>/Scripts/python.exe",
    }
  ],
};

在 运行 pm2 start <Your_Path_To_Ecosystem> 之后,它会生成一个 window,其中包含您的其他进程。在这种情况下,我的目录中特别有 Tensorflow 模型(也是相对路径的“cwd”配置的原因)我需要在其他进程中使用。