Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Popen()有时会阻塞进程(通常在CPU负载下)_Python_Operating System_Subprocess_Popen - Fatal编程技术网

Python Popen()有时会阻塞进程(通常在CPU负载下)

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",

我正在模拟计算机网络的流量生成器(在我的测试中,每台计算机都是一个linux名称空间)。每台计算机都有一个服务器(用python编写)运行并侦听命令。它可以生成TCP发送方(使用套接字)或TCP接收方(使用netcat)。在启动每个发送方之前,我向接收方的服务器发送一个命令,以便在发送方开始发送数据之前生成TCP接收方

为了处理进程并在必要时杀死它们,每次需要TCP侦听器时,我都使用
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个进程。我的极限是50K
fd


我还能试什么?我想使用
Popen
,因为我可以优雅地终止进程,这是我无法使用
os.system()

的。这两个命令是不等效的。在
os.system
中添加
&
,它告诉shell在后台运行程序。在
Popen
中不执行此操作,如果执行此操作,则必须使用
shell=True
。默认情况下
Popen
是非阻塞的。因此,您不需要使用
&
。您可以通过执行:
Popen().wait()
来进行
Popen
阻塞,但实际情况并非如此。正如我在问题中所说,它有时会被阻塞(只是在我稍微强调程序时)。对于netcat,为什么不直接使用套接字?@inf我想这会解决问题,但不知何故,即使是最简单的python程序也要多使用3%的CPU,而我正在运行大量的进程,每个流3%的进程是非常多的。@edgarcosta说得通,然而,我怀疑在python中直接使用套接字比生成一个进程然后做额外的工作需要更多的CPU。在CPU使用方面,使用PyPy可能会有所帮助。