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

时间:2016-11-28 11:42:30

标签: python operating-system subprocess popen

我正在模拟计算机网络的流量生成器(对于我的测试,每台计算机都是一个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()无法做到的。

0 个答案:

没有答案