纯python字节管道

纯python字节管道,python,Python,如何将两个对象连接到一个圆形(最好是动态调整大小的)缓冲区,该缓冲区可以被视为管道或插座的两侧?即,一个对象可以从某个fifo缓冲区读取并关闭读取端,另一个对象可以在那里写入并关闭写入端。我不需要任何轮询/选择功能 一个进程,一个线程。不涉及IPC或同步。(这已单独实施。) 它们应该用作来自其他源的数据的适配器,这些源不是类似文件的对象,但可以表示为流 如果我用手写的话,我会觉得我发明了一个轮子 也许io模块的一些类组合可以实现这一点。是否存在跨平台操作系统级fifo/管道对象 解决方案必须是内

如何将两个对象连接到一个圆形(最好是动态调整大小的)缓冲区,该缓冲区可以被视为管道或插座的两侧?即,一个对象可以从某个fifo缓冲区读取并关闭读取端,另一个对象可以在那里写入并关闭写入端。我不需要任何轮询/选择功能

一个进程,一个线程。不涉及IPC或同步。(这已单独实施。)

它们应该用作来自其他源的数据的适配器,这些源不是类似文件的对象,但可以表示为流

如果我用手写的话,我会觉得我发明了一个轮子

也许
io
模块的一些类组合可以实现这一点。是否存在跨平台操作系统级fifo/管道对象


解决方案必须是内存有效的。

效率不是很高,但这里就是

from collections import deque


class AlreadyClosed(Exception):
    pass


class NothingToRead(Exception):
    pass


def make_pipe():
    queue = deque()

    class Reader(object):
        closed = False

        @staticmethod
        def read():
            if Reader.closed:
                raise AlreadyClosed()
            if Writer.closed:
                return b''
            try:
                return queue.popleft()
            except IndexError:
                raise NothingToRead()

    class Writer(object):
        closed = False

        @staticmethod
        def write(chunk):
            if Writer.closed:
                raise AlreadyClosed()
            if Reader.closed:
                return 0
            queue.append(chunk)
            return len(chunk)

    return Reader, Writer


if __name__ == '__main__':
    r, w = make_pipe()
    w.write(b'qwe')
    w.write(b'asd')
    print(r.read())
    print(r.read())
    try:
        print(r.read())
    except NothingToRead as e:
        print(repr(e))

真正的跨平台管道,即使在子流程中也可以使用真正的文件句柄,它是
multipricessing.pipe
,并使用其文件描述符:

import multiprocessing 
import os

conn_out, conn_in = multiprocessing.Pipe(duplex=False)
os.write(conn_in.fileno(), b'Hello.')
print(os.read(conn_out.fileno(), 10))
请注意,方法
multipricessing.Pipe.send
multipricessing.Pipe.recv
使用字节和方法
multipricessing.Pipe.send_字节
multipricessing.Pipe.recv_字节
添加标题