在问题Python - non-blocking sockets using selectors中,使用以下代码:
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:]
答案 0 :(得分:0)
在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
与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')
if语句验证值的输出和每个掩码值的顺序在mask = 5、6等时重复其自身。