在问题Python - non-blocking sockets using selectors中使用以下代码:
事件 = 选择器.EVENT_READ |选择器.EVENT_WRITE
https://docs.python.org/3/library/selectors.html 中未提及或解释 event_read 或 event_write 标志的值。 select()
模块中或 https://realpython.com/python-sockets/ 中都没有给出解释。 。如果能强调这一特定部分或提供比 python 文档或 realpython 链接提供的更详细解释的阅读 Material ,我们将不胜感激。
相对而言,在服务连接期间使用: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
的对应位,则输出的每一位均为 1与 selectors.EVENT_READ
为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')
- 如果掩码 = 0 |上面的 if 语句对于下面的情况都不成立。
- 如果掩码 = 1 |只有 event_read 为 true。
- 如果掩码 = 2 |只有 event_write 为 true。
- 如果掩码= 3 |两个 if 语句都为 true。
对于 mask = 5、6 等,每个掩码值的 if 语句验证值输出和顺序都会重复。
关于python - 选择器中读/写的值状态是什么。EVENT_READ |选择器.EVENT_WRITE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56828742/