擅长:python、mysql、java
<p>尝试将<code>close_fds=True</code>添加到您的<code>Popen</code>呼叫中(参见讨论<a href="https://stackoverflow.com/questions/4940607/python-subprocesses-experience-mysterious-delay-in-receiving-stdin-eof">here</a>)。如果在其他线程中打开了其他管道,则可能是它们以某种方式交互(强制执行线程的特定顺序)。考虑使用<code>Popen.communicate()</code>,而不是直接从进程的stdout流中读取。尽管如此,您的ping实现似乎不太可能根据其输出的缓冲程度返回不同的读数。在</p>
<p>在更高的层次上,您应该记住ping定时数据本质上是不可靠的。如果您无法修复峰值,并且确信它是来自<code>Popen</code>调用的伪制品(而不仅仅是随机噪声),那么对数据进行后期处理可能是合理的。例如,可以一次收集5个数据点,然后取中间值。(请注意,中位数对异常值的敏感性低于平均值)。这并不比<code>ping</code>已经在做的事情糟糕。在</p>
<p><strong>更新26/02</strong></p>
<p>很抱歉听到^没用。其他一些想法:</p>
<p><strong>1.</strong>如果我们了解更多关于如何从shell运行<code>ping</code>的信息,可能会有所帮助。在python中,使用<code>-c1</code>将<code>ping</code>限制为一次尝试。我猜,在shell中,您只需运行<code>ping hostname</code>并实时观察结果,这是真的吗?如果是,请尝试运行bash脚本,如下所示:</p>
<pre><code>#! /bin/bash
for i in {1..50}
do
ping -c1 somehostname
# maybe 'sleep 1' here
done
</code></pre>
<p>仔细看看结果。峰值可能是您调用<code>ping</code>的结果。在</p>
<p><strong>2.</strong>示例代码没有正则表达式定义。您是否百分之百确定他们从ping的输出中捕获了正确的值?在</p>