使用Python Twisted与文件描述符的示例

3 投票
2 回答
2966 浏览
提问于 2025-04-15 18:03

我想用twisted来控制Linux中的管道(os.pipe())和命名管道(os.mkfifo())之间的通信,这些管道是用来连接一个主进程和一组从进程的。虽然我相信twisted可以用在这些类型的文件描述符上(毕竟,twisted在处理tcp套接字方面表现很好,而*nix系统把它们也当作文件描述符来处理),但我找不到任何这方面的例子。有没有人能提供一些链接、示例代码或者建议呢?

2 个回答

12

你可以使用 reactor.spawnProcess 来设置父进程和它创建的子进程之间的文件描述符映射。简单来说,就是你可以让子进程通过一些额外的输出通道,把数据发送回父进程。比如,如果你想运行一个程序,并且给它两个额外的输出通道(除了标准输入、标准输出和标准错误),你可以这样做:

reactor.spawnProcess(protocol, executable, args,
                     childFDs={0: 'w', 1: 'r', 2: 'r', 3: 'r', 4: 'r'})

这个 reactor 会为你处理管道的创建,当从这些管道读取到数据时,它会调用你在 ProcessProtocol 中传入的 childDataReceived 方法。想了解更多细节,可以查看 spawnProcess 的 API 文档

如果你在子进程中也使用 Twisted,那么你主要需要关注 twisted.internet.stdio。在 核心示例 中的 stdiodemo.py 和 stdin.py 会教你如何使用这个模块。

-3

它没有内置的异步输入输出功能。有人为它写了一个libaio的封装,但是这个封装很久没有更新了,我也不知道它现在是否还能用。

在最糟糕的情况下,你可以使用select来检查是否有东西可以读取,但这对写入操作没有帮助。

撰写回答