代码之家  ›  专栏  ›  技术社区  ›  too much php

需要解决方法:Python的select.select()不能与子进程的stdout一起使用?

  •  1
  • too much php  · 技术社区  · 16 年前

    在我的主python程序中,我使用以下代码生成一个子程序:

    child = subprocess.Popen(..., stdout=subprocess.PIPE, stdin=subprocess.PIPE)
    

    FWIW,child是一个PHP脚本,需要与python程序来回通信。

    python主程序实际上需要侦听来自其他几个通道的通信—使用相同代码生成的其他PHP脚本,或来自其他通道的套接字对象 socket.accept() select.select()

    我的问题是 在Windows下,无法使用子进程的标准文件描述符(这是有文档记录的),看起来我将被迫:

    • A) 轮询PHP脚本,查看它们是否已将任何内容写入stdout。(这个系统需要非常灵敏,我需要每秒至少进行1000次投票!)
    • B) 让PHP脚本连接到主进程,并通过套接字而不是stdout/stdin进行通信。

    我可能会选择解决方案(B),因为我无法让自己以如此高的频率进行系统轮询,但在stdout/stdin可以正常工作的情况下,重新连接套接字似乎是一种可悲的资源浪费。

    是否有其他解决方案允许我使用stdout ?

    1 回复  |  直到 16 年前
        1
  •  4
  •   Daniel Pryden    16 年前

    不幸的是,Windows上管道的许多用法不如Unix上的好,这就是其中之一。在Windows上,更好的解决方案可能是让主程序生成线程来侦听其每个子进程。如果您知道期望从子进程返回的数据的粒度,您可以在每个线程中执行阻塞读取,然后当IO解除阻塞时,该线程将激活。

    select.select() 将在子流程管道上工作。