【问题标题】:Python - How to make pm2 working with multiprocessing?Python - 如何使 pm2 与多处理一起工作?
【发布时间】:2020-08-17 14:34:09
【问题描述】:

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

(我所说的 pm2 的意思是,每当您使用 multiprocessing 运行时,它都会创建一个 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()

【问题讨论】:

  • 能否请您添加您在 shell 中确切运行的命令
  • @BraveButter 我只是写了pm2 start test.py - 我确实意识到如果我删除 multiprocessing.Process - 它确实会写入全局日志,但是一旦它在代码中,它就会打开 python.exe 文件并穿过那里
  • @Hellosiroverthere 你解决了吗?我还试图让一个使用多处理库的 PM2 运行 python 服务。在没有任何额外配置的情况下,它在 PM2 中以“集群”模式启动,但没有分配 PID。

标签: python node.js pm2


【解决方案1】:

成功运行使用pythonsmultiprocessing 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(或您在“名称”中称呼它),因为即使使用--update-env 标志,它也不会使用更新的pm2.config.json。不知道为什么。

如果您使用 pm2.config.json 文件,那么(我认为)您可以通过将 -i 0 标志传递给 pm2 start 来强制分叉模式。如果有人可以测试并确认这一点,我想对此进行更新以发表某种声明。

【讨论】:

    【解决方案2】:

    这是我对 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 &lt;Your_Path_To_Ecosystem&gt; 后,它将生成一个包含您的其他进程的窗口。在这种情况下,我的目录中专门有 Tensorflow 模型(也是相对路径的“cwd”配置的原因),我需要在其他进程中使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 2019-05-16
      • 2023-02-16
      • 2017-11-07
      • 2020-07-03
      • 2021-06-25
      相关资源
      最近更新 更多