温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python 3.x - What are the value states of read/write in selectors.EVENT_READ | selectors.EVENT_WRITE?
python-3.x client-server

python 3.x - 在选择器中读/写的值状态是什么。

发布于 2020-03-27 11:27:49

在问题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:]

查看更多

查看更多

提问者
ZF007
被浏览
26
ZF007 2019-07-04 21:37

在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:“按位与” 的情况下适用。如果maskAND 的对应位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. 如果mask = 0 | 以上所有if陈述均不适用于以下情况。
  2. 如果mask = 1 | event_read为true。
  3. 如果mask = 2 | event_write为true。
  4. 如果mask = 3 | 两个if语句均为true。

如果掩码= 5、6等,则每个掩码值的if语句验证值输出和顺序重复。

按位运算符引用12