Python的multiprocessing
模块中的Pipes和Queue基于匿名管道,那么它是否提供命名管道(FIFO)呢?
Python的multiprocessing
模块中的Pipes和Queue基于匿名管道,那么它是否提供命名管道(FIFO)呢?
multiprocessing
没有内置支持跨平台抽象命名管道。
如果您只关心Unix或Windows,当然可以手动创建命名管道。对于Unix,mkfifo
在标准库中。对于Windows,您必须使用ctypes
或cffi
,或者像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()
sharedctypes
,它只用于由multiprocessing
专门创建的进程树 - 但你可能可以稍微滥用它,或者分叉代码(注意multiprocessing
文档链接到源代码,虽然有很多内容,但大部分都相当简单...)。但这可能是一个单独的问题(也可能是一个很好的问题要问)。 - abarnertclass multiprocessing.connection.Listener([address[, family[, backlog[, authkey]]]])
这是一个对绑定套接字或Windows命名管道进行封装的监听器,用于监听连接。address是监听器对象的绑定套接字或命名管道使用的地址。
pipe
标签专门用于Unix匿名管道,而fifo
标签则是关于队列和管道的一般性描述;命名管道的标签是named-pipes
。 - abarnert