多处理是不是支持命名管道(FIFO)?

Posted

技术标签:

【中文标题】多处理是不是支持命名管道(FIFO)?【英文标题】:Does multiprocessing support named pipes (FIFO)?多处理是否支持命名管道(FIFO)? 【发布时间】:2018-04-28 08:35:31 【问题描述】:

Multiprocessing的PipesQueue都是基于匿名管道的,Python的multiprocessing是否提供了命名管道(FIFO)?

【问题讨论】:

顺便说一下,pipe标签专门针对Unix匿名管道,fifo标签一般针对队列和管道;命名管道的标签是named-pipes 【参考方案1】:

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

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

试图抽象出两者之间的语义差异是非常痛苦的,这可能是 stdlib 不尝试这样做的原因。 (例如,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 AFAIK,它使用 Windows 命名管道(和 Unix 上的 UNIX 套接字)提供比通用命名管道更简单的抽象。我错了吗?你真的可以使用Listener 访问命名管道的任何功能吗?因为如果是这样,那就太酷了。 @ abarnert 你是对的。我有另一个问题。 multiprocessing.sharedctypes 是否支持独立进程?我认为它只支持父子进程或兄弟进程通信。 @QuantumEnergy 这仍然可能提供您在特定用例中实际寻找的所有内容,因此绝对值得一提。但既然你已经写了一个很好的答案,我只会赞成你的,而不是编辑我的。至于sharedctypes,它仅适用于multiprocessing 专门创建的进程树——但您可能会轻微滥用它,或者分叉代码(注意multiprocessing 文档链接到源代码,并且,虽然有很多,但大多数都很简单......)。但这可能是一个单独的问题(并且可能是一个很好的问题)。 我创建了一个新问题。希望有人能得出结论。 ***.com/questions/50084557/…【参考方案2】:

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

绑定套接字或 Windows 命名管道的包装器,它正在“侦听”连接。address 是绑定套接字或侦听器对象的命名管道使用的地址。

【讨论】:

以上是关于多处理是不是支持命名管道(FIFO)?的主要内容,如果未能解决你的问题,请参考以下文章

进程间通信--FIFO(命名管道)

Linux系统编程——进程间通信:命名管道(FIFO)

Linux学习笔记(13)-进程通信|命名管道

IPC - 命名管道(fifo)- 使用

进程间通信——命名管道

简述Linux进程间通信之命名管道FIFO