使用wget包装在python2.7子进程中运行永远

时间:2017-09-09 03:40:16

标签: python linux python-2.7 ubuntu wget

这是我的代码:

func mapView(_ didSelectmapView: MKMapView, didSelect view: MKAnnotationView) {
    print("Annotation selected")

    if let drawer = self.parent as? PulleyViewController {
        let drawerContent = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "NewDrawerViewController")

        drawer.setDrawerContentViewController(controller: drawerContent, animated: false)
        drawer.setDrawerPosition(position: PulleyPosition.partiallyRevealed, animated: false)

    }
}

这在一个非常小的目录上运行。我不明白为什么?

1 个答案:

答案 0 :(得分:1)

<div id="red">Red</div> <div id="green">Green</div>进程最终将被阻塞,因为它正在等待其wgetstdout管道变为可写,如果它写入足以填充该管道的内核缓冲区。默认情况下,这就是管道在Unix中的工作方式:编写器进程将减慢以匹配读取器进程的速度,如果读取器停止读取,则编写器停止写入(如果读取器退出,则编写器被杀死!)

有几种不同的方法可以解决这个问题。

  • 要防止缓冲区变满,请同时阅读stderrp.stdout。在p.stderr stdoutwget阻止时,请注意不要阻止stderr,反之亦然...您必须同时从两者中读取。这就是p.communicate()内部工作的方式。这是最复杂的解决方案,但如果您查看Popen._communicatesubprocess.py的源代码,您就会看到它应该如何工作。

  • 从代码中删除while p.poll() is None循环。

  • 不要将wget重定向到管道,将其重定向到其他内容,例如常规文件或/dev/null