Python 多进程队列文件描述符

3
我想知道队列是否有文件描述符,以及如何找到它?
1个回答

8
Queue 类使用单向 multiprocessing.Pipe() 进行通信。
你可以通过连接的 (私有) ._reader._writer 属性获取管道的任一端,并且 (至少在 POSIX 上),这些属性具有 .fileno() 方法。
>>> import multiprocessing
>>> queue = multiprocessing.Queue()
>>> queue._reader.fileno()
3
>>> queue._writer.fileno()
4

让我强调一下这里的“私有”名称; ._reader._writer 属性是实现细节,因此可以在将来的版本中更改而不会破坏已发布的API。请自行承担风险。


1
fileno() 方法始终存在,但在非 POSIX 操作系统中,它可能返回进程句柄而不是文件描述符。 顺便说一下,我更强调使用 _reader_writer 是实现细节,并且不能保证未来将会起作用。 - Bakuriu
1
@Bakuriu:这就是我在(private)标记中所指的,我会更加强调它。很高兴看到确认Windows也有用于单向管道的.fileno()方法(我在源代码中看到的只有win32.ConnectNamedPipe()被使用,而我不熟悉该调用)。 - Martijn Pieters
非常感谢,我只是想知道为什么Python官网上没有关于这方面的文档。我对编程有很好的掌握,并且可以编写大部分我需要的Python代码,但是一些高级的东西却总是找不到相关文档。 - WojonsTech
1
@WojonsTech:这并没有被记录在官方API中,因此您需要进行代码深入了解。队列API旨在作为更高级别的通信对象,作者不希望您需要访问文件句柄。 - Martijn Pieters
1
@WojonsTech:与Java不同,Python易于内省。您可以在几乎任何东西上运行dir(),例如dir(Queue())会显示._reader._writer属性。通过记录这些属性,它们将被固定下来以供未来版本支持,现在实现可以根据需要自由更改。 - Martijn Pieters
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接