多进程支持命名管道(FIFO)吗?

4

Python的multiprocessing模块中的PipesQueue基于匿名管道,那么它是否提供命名管道(FIFO)呢?


顺便说一下,pipe标签专门用于Unix匿名管道,而fifo标签则是关于队列和管道的一般性描述;命名管道的标签是named-pipes - abarnert
2个回答

3

multiprocessing没有内置支持跨平台抽象命名管道。

如果您只关心Unix或Windows,当然可以手动创建命名管道。对于Unix,mkfifo在标准库中。对于Windows,您必须使用ctypescffi,或者像win32api这样的第三方库来调用带有正确参数的CreateFile

试图在两者之间抽象语义差异非常痛苦,这可能是标准库不尝试这样做的原因。(例如,Windows命名管道是易失性的;posix命名管道是永久性的。)

这里是一个微不足道的Unix示例:

import multiprocessing
import os

def child():
    with open('mypipe', 'rb') as p:
        print(p.read())

def main():
    try:
        os.mkfifo('mypipe')
    except FileExistsError:
        pass
    multiprocessing.Process(target=child).start()
    with open('mypipe', 'wb') as p:
        p.write(b'hi')
    os.remove('mypipe')

if __name__ == '__main__':
    main()

multiprocessing.connection.Listener 支持 Windows 命名管道。 - QuantumEnergy
据我所知,@QuantumEnergy使用Windows命名管道(在Unix上使用UNIX套接字)来提供比通用命名管道更简单的抽象。我错了吗?您是否可以使用“Listener”访问任何命名管道的功能?如果是这样,那将非常酷。 - abarnert
@abarnert 没错,我还有一个问题。multiprocessing.sharedctypes 支持独立进程吗?我认为它只支持父子进程或兄弟进程之间的通信。 - QuantumEnergy
@QuantumEnergy 这可能仍然能够满足你在特定使用情况下所需的一切,所以绝对值得一提。但由于你已经写了一个很好的答案,我会选择点赞你的回答而不是编辑我的回答。至于sharedctypes,它只用于由multiprocessing专门创建的进程树 - 但你可能可以稍微滥用它,或者分叉代码(注意multiprocessing文档链接到源代码,虽然有很多内容,但大部分都相当简单...)。但这可能是一个单独的问题(也可能是一个很好的问题要问)。 - abarnert
我创建了一个新问题。希望有人能得出结论。 https://dev59.com/J6rka4cB1Zd3GeqPmP21 - QuantumEnergy

2

class multiprocessing.connection.Listener([address[, family[, backlog[, authkey]]]])

这是一个对绑定套接字或Windows命名管道进行封装的监听器,用于监听连接。address是监听器对象的绑定套接字或命名管道使用的地址。


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