gpt4 book ai didi

Python多进程运行多次

转载 作者:行者123 更新时间:2023-12-01 23:48:25 25 4
gpt4 key购买 nike

我正在尝试同时运行两个 python 文件(A.py 和 B.py)。我尝试以两种不同的方式运行它们并使用两个单独的命令来运行它们,效果很好。

问题是,我希望有一个脚本文件来并行运行它们。我尝试使用以下代码进行多处理:

if __name__ == '__main__':
jobs=[]
jobs.append(Process(target=A.start))
jobs.append(Process(target=B.start))

for job in jobs:
job.start()

for job in jobs:
job.join()

结果是它运行 A 和 B 两次,我希望它们每个只运行一次。

问题的原因是什么,我该如何解决?或者是否有任何其他解决方案可以并行运行两个 python 文件?

提前感谢您的帮助。

对于我的导入信息,我有三个文件:A.py、B.py 和 run.py。

在 A.py 中,我有:

from scapy.all import *
from scapy.layers.http import HTTPRequest
from scapy.layers.http import HTTPResponse
from colorama import init, Fore
import docker
import time
import redis

在 B.py 中,我有:

import json
import docker
import socket
import time
import psutil
import socket
import redis
import prometheus_client
from prometheus_client import Gauge,Counter
from prometheus_client.core import CollectorRegistry
from flask import Response, Flask

在 run.py 中,我有:

from multiprocessing import Process
import A
import B

====更新问题原因====

玩了几个小时代码后,我想我找到了原因,但我不明白为什么。

原因在我的A.py文件里,我有代码

#flask starts
app.run(host="0.0.0.0", port=15600,debug=True)

如果我删除 Debug模式,代码运行良好。只有在 Debug模式打开时才会出现此问题。

有人知道为什么会这样吗?

最佳答案

我认为您正在寻找的是 multiprocessing.Pool,特别是 Pool.apply_async。这将允许您异步启动将并行执行不相关任务的单独进程。你可以像这样使用它:

A.py:

def square(x):
print('x squared is: ' + str(x**2))

B.py:

def cube(x):
print('x cubed is: ' + str(x**3))

然后:

import multiprocessing as mp
import A
import B

p = mp.Pool(2)

a = p.apply_async(A.square, args=(5,))
b = p.apply_async(B.cube, args=(7,))

p.close()


更新

好的,鉴于新信息,发生这种情况的原因非常简单但可能不明显,并且与您使用多处理无关(尽管这很可能会给您带来麻烦如果你打算在真正的网络服务器上运行这个应用程序,而不是 Flask 内置的服务器)。

当您在 debug 模式下运行 Flask 调试服务器并打开 use_reloader 时,它会启动 2 个进程。父进程监视您的代码,当检测到更改时,它会向子进程发出重新加载的信号。这就是为什么 Flask 服务器能够立即应用您所做的任何代码更改而无需您执行任何操作的原因。您遇到的问题是您的代码正在父级和子级中运行。

有两种方法可以修复它。

  1. 不要使用 debug=True
  2. 使用 debug=True,但也可以通过添加 use_reloader=False 来禁用重新加载程序。

选项 (2) 可能是更有吸引力的解决方案,因为您仍然可以访问调试控制台,但您也会失去自动重新加载功能,因此您需要在应用更改之前手动重新启动服务器。为此,请将 app.run 行更改为:

app.run(host="0.0.0.0", port=15600, debug=True, use_reloader=False)

关于Python多进程运行多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63823685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com