我觉得我缺少关于python 选择器工作方式的一些重要信息。我试着用插座来使用它们。一旦套接字被“注册”到选择器,我就开始循环并在选择器(A)上“选择”。如果返回某项内容,则选择器将使用MsgEnvelope
类的数据“注册”,代码如下(B)。这就是我在MsgEnvelope
类中遇到的问题--我有一个读方法和一个写方法,但是我没有看到它被调用。(注意,我有日志显示客户端连接,但之后没有)
def accept_wrapper(self, tmp_sock):
connect, address = tmp_sock.accept()
logging.info(f"accepted connection from {address}")
connect.setblocking(False)
message = MsgEnvelope(self.selector, connect, address) # <<< B
self.selector.register(connect, selectors.EVENT_READ, data=message)
def receive(self):
for key, mask in self.selector.select(timeout=None): # <<< A
if key.data is None:
self.accept_wrapper(key.fileobj)
else:
yield key.data
因此,当“服务器”用消息注册EVENT.READ时,我不明白如何读取MsgEnvelope
类中的字节?
在selector.register
方法中用作data关键字的类中需要哪些方法。正如文件上说的
数据是一个不透明的对象。
瓦特?
发布于 2022-01-25 22:10:46
我似乎误解了我应该如何使用选择器。selector.select
将产生一个“密钥”和一个“掩码”。在我的例子中,关键数据属性是MsgEnvelope,掩码是查看它是读还是写的比特。
https://stackoverflow.com/questions/70858470
复制相似问题