Python Popen()有时会阻塞进程(通常在CPU负载下)
我正在模拟计算机网络的流量生成器(在我的测试中,每台计算机都是一个linux名称空间)。每台计算机都有一个服务器(用python编写)运行并侦听命令。它可以生成TCP发送方(使用套接字)或TCP接收方(使用netcat)。在启动每个发送方之前,我向接收方的服务器发送一个命令,以便在发送方开始发送数据之前生成TCP接收方 为了处理进程并在必要时杀死它们,每次需要TCP侦听器时,我都使用Python Popen()有时会阻塞进程(通常在CPU负载下),python,operating-system,subprocess,popen,Python,Operating System,Subprocess,Popen,我正在模拟计算机网络的流量生成器(在我的测试中,每台计算机都是一个linux名称空间)。每台计算机都有一个服务器(用python编写)运行并侦听命令。它可以生成TCP发送方(使用套接字)或TCP接收方(使用netcat)。在启动每个发送方之前,我向接收方的服务器发送一个命令,以便在发送方开始发送数据之前生成TCP接收方 为了处理进程并在必要时杀死它们,每次需要TCP侦听器时,我都使用Popen生成netcat进程。我的工作如下: process = subprocess.Popen(["nc",
Popen
生成netcat进程。我的工作如下:
process = subprocess.Popen(["nc", "-l", port], stdout=open(os.devnull, "w"))
processes_TCPServers.append(process)
首先创建流程,然后将所有流程存储在一个列表中,以便在需要时清理所有内容
问题
假设我只有16位主持人。当我在几秒钟内启动大量流时,一些主机的服务器在Popen
调用时被阻塞,而其他主机的服务器则没有
但是,如果改用os.system()
:
os.system("nc -l -p {0} >/dev/null 2>&1 &".format(port))
所有TCP侦听器都会生成,没有任何内容会被阻止。即使我在几秒钟内启动6K流
观察结果
我尝试使用选项shell=True
,但问题仍然存在
有人告诉我,可能是我达到了每个进程的最大文件描述符限制。但我不这么认为,我只是开始(如果没有任何东西被阻止)每个进程20个进程。我的极限是50Kfd
我还能试什么?我想使用
Popen
,因为我可以优雅地终止进程,这是我无法使用os.system()
的。这两个命令是不等效的。在os.system
中添加&
,它告诉shell在后台运行程序。在Popen
中不执行此操作,如果执行此操作,则必须使用shell=True
。默认情况下Popen
是非阻塞的。因此,您不需要使用&
。您可以通过执行:Popen().wait()
来进行Popen
阻塞,但实际情况并非如此。正如我在问题中所说,它有时会被阻塞(只是在我稍微强调程序时)。对于netcat,为什么不直接使用套接字?@inf我想这会解决问题,但不知何故,即使是最简单的python程序也要多使用3%的CPU,而我正在运行大量的进程,每个流3%的进程是非常多的。@edgarcosta说得通,然而,我怀疑在python中直接使用套接字比生成一个进程然后做额外的工作需要更多的CPU。在CPU使用方面,使用PyPy可能会有所帮助。