selectors.EVENT_READ 中 read/write 的值状态是什么 | selectors.EVENT_WRITE?

What are the value states of read/write in selectors.EVENT_READ | selectors.EVENT_WRITE?

问题中使用了以下代码:

events = selectors.EVENT_READ | selectors.EVENT_WRITE

event_read 或 event_write 标志的值未在 https://docs.python.org/3/library/selectors.html. Neither is an explanation give in the select() module or given at https://realpython.com/python-sockets/ 中提及或解释。如果能强调这一特定部分或提供比 python 文档或真实 python link.

相关的,在服务连接期间使用: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 文件中创建了以下变量:

  1. EVENT_READ = (1 << 0)
  2. 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: 的情况下应用 "bitwise and"。如果 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')
  1. 如果掩码 = 0 |以上if-statements中的None以下为真
  2. 如果掩码 = 1 |只有 event_read 是正确的。
  3. 如果掩码 = 2 |只有 event_write 是正确的。
  4. 如果掩码 = 3 |两个 if 语句都为真。

对于掩码 = 5、6 等,每个掩码值的 if-statement 验证值输出和顺序重复自身。

按位运算符引用 1 and 2