Python 使用select进行线程间通信的干净方式

Python 使用select进行线程间通信的干净方式,python,multithreading,Python,Multithreading,我正在尝试用Python实现一个FUSE驱动的文件系统,它同时提供来自本地和远程源的数据。文件系统由主FUSE线程处理:文件系统请求在被请求时直接处理 class MyFilesystem(Fuse): def read(self, path, size, offset): if self._isLocalFile(path): return self._localRead(path, size, offset) elif self

我正在尝试用Python实现一个FUSE驱动的文件系统,它同时提供来自本地和远程源的数据。文件系统由主FUSE线程处理:文件系统请求在被请求时直接处理

class MyFilesystem(Fuse):
    def read(self, path, size, offset):
        if self._isLocalFile(path):
            return self._localRead(path, size, offset)
        elif self._isRemoteFile(path):
            # get file from server
    # ...
我曾想过在初始化时创建第二个线程,以保持客户端和服务器之间的通信畅通。命令双向流动,因此客户端当前使用select()调用等待任何传入命令

class CommsClient(threading.Thread):
    def run(self):
        conn = self._connect()
        while True:
            r, w, e = select.select([conn], [], [], 1.0)
            if conn in r:
                self._handleData(conn)
    # ...
我现在的问题是连接两个线程。当文件系统线程处理请求时,它可能必须阻塞,直到comms线程从服务器返回应答为止。我认为实现这一点的一种方法是将文件系统线程的请求流/套接字插入
select()
调用,但我不确定套接字是否最好用于线程间通信。缩短
select()
超时并检查事件或线程间变量也会起作用,我想,但我希望机制尽可能快


有人知道处理这种情况的最佳方法吗?

使用套接字进行线程间通信是完全可以接受的,但这比使用内存中数据结构的线程和锁来实现要慢。 请注意,“较慢”是相对的:硬盘操作可能仍然较慢十倍

虽然这不是对这个问题的直接回答,但我可以推荐您看看

? 这是一个非常快速的解决方案,它为您提供了“套接字”,可以跨进程内、进程间、TCP和多播等各种传输传输传输整个消息,并且它具有异步I/O。

如果其他人从中受益,我最终使用的解决方案包括使用
线程。事件
锁定和非阻塞
选择()
调用:

class MyFilesystem(Fuse):
    def read(self, path, size, offset):
        if self._isLocalFile(path):
            return self._localRead(path, size, offset)
        elif self._isRemoteFile(path):
            # get file from server
            self.commsThread.requested_file = path
            self.commsThread.done_event.clear()
            self.commsThread.retrieved_file = None
            self.commsThread.request_event.set()

            self.commsThread.done_event.wait()

            return self.commsThread.retrieved_file[offset:offset+size]

class CommsClient(threading.Thread):
    def run(self):
        conn = self._connect()
        while True:
            self.request_event.wait(0.1)
            if self.request_event.is_set():

                conn.request_file(self.requested_file)

            r, w, e = select.select([conn], [], [], 0.0)

            if conn in r:
                self._handleData(conn)
                if self.retrieved_file:
                    self.done_event.set()
    # ...

谢谢阅读了ØMQ文档(确实是非常有趣的东西),我想到了使用锁的方法。目前效果更好,因为我已经实现了客户机/服务器通信,但下次我肯定会使用ØMQ。