1

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

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

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

主 python 程序实际上需要侦听来自其他几个通道的通信 - 使用相同代码生成的其他 PHP 脚本,或来自 的套接字对象socket.accept(),我想使用select.select()它,因为这是等待来自各种输入的最有效方式的来源。

我遇到的问题是,select.select()在 Windows 下不能使用子进程的标准输出文件描述符(这是记录在案的),看起来我将被迫:

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

我可能会选择解决方案(B),因为我不能让自己以如此高的频率进行系统轮询,但是当 stdout/stdin 做得很好时,重新连接套接字似乎是一种可悲的资源浪费。

是否有一些替代解决方案可以让我使用 stdout select.select()

4

1 回答 1

4

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

或者,(我不知道这对您的项目是否可行),您可以考虑使用类 Unix 系统,或 Windows 之上的类 Unix 层(例如 Cygwin),select.select()在子进程管道上工作。

于 2009-10-07T23:49:49.653 回答