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”配置的原因)我需要在其他进程中使用。
所以我发现了关于 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”配置的原因)我需要在其他进程中使用。