在问题Python-使用选择器的非阻塞套接字中,使用了以下代码:
events = selectors.EVENT_READ | selectors.EVENT_WRITE
在https://docs.python.org/3/library/selectors.html上没有提及也没有说明event_read或event_write标志的值。在select()
模块中也没有给出解释,也没有在https://realpython.com/python-sockets/给出解释。希望强调这一特定部分或提供比python docs或realpython链接提供的阅读材料更详尽的解释。
与此相关,在服务连接期间使用了以下方法: if mask & selectors.EVENT_READ:
我可以想象评估可以是1&1或2&2,并且在两种情况下都执行if语句中的代码。因此,如果表达式的计算结果为3&1,它将不会执行,对吗?
代码:
def service_connection(key, mask):
sock = key.fileobj
data = key.data
if mask & selectors.EVENT_READ:
recv_data = sock.recv(1024)
if recv_data:
data.outb += recv_data
else:
print('closing connection to', data.addr)
sel.unregister(sock)
sock.close()
if mask & selectors.EVENT_WRITE:
if data.outb:
print('echoing', repr(data.outb), 'to', data.addr)
sent = sock.send(data.outb)
data.outb = data.outb[sent:]
在python selectors.py
文件中,创建以下变量:
EVENT_READ = (1 << 0)
EVENT_WRITE = (1 << 1)
如果同时打印两个,则为每个状态给出以下值:
print(EVENT_READ) = 1
print(EVENT_WRITE) = 2
以下是什么快乐(向左移一点):
bin(0b1) -> '0b1' # bitwise operator for EVENT_READ = (1 << 0)
bin(0b1) -> '0b10' # bitwise operator for EVENT_WRITE = (1 << 1)
在if mask & selectors.EVENT_READ:
“按位与” 的情况下适用。如果mask
AND 的对应位selectors.EVENT_READ
为1,则输出的每个位均为1,否则为0。
mask = integer # 0, 1, 2, 3 or higher.
if mask & EVENT_READ:
print ('mask & EVENT_READ')
if mask & EVENT_WRITE:
print ('mask & EVENT_WRITE')
如果掩码= 5、6等,则每个掩码值的if语句验证值输出和顺序重复。