到目前为止,我一直在使用阻塞/同步套接字,因为我已经意识到在执行IO时非阻塞/异步套接字可以更强大。
所以,为了开始我决定创建一个简单的项目创建一个非阻塞套接字,能够在设置事件时进行读写,所以我基本上在选择器中注册事件然后进入无限循环等待事件,当事件设置时,我回调它们。
import socket
import selectors
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking(False)
selector = selectors.DefaultSelector()
def write():
print('Able to Write')
sock.send(b'Hello')
#I don't want to keep sending data, so I don't re-register the event
def read():
print('Able to Read')
data = sock.recv(1024).decode()
selector.register(sock.fileno(), selectors.EVENT_READ, read)
# I register the event again because I'd like to keep reading from the socket.
# I don't use events here...
try:
sock.connect(('localhost', 80))
except BlockingIOError:
pass
# I register read and write events with their respective callbacks. Error is raised...
selector.register(sock.fileno(), selectors.EVENT_READ, read)
selector.register(sock.fileno(), selectors.EVENT_WRITE, write)
while True:
events = selector.select()
for key, _ in events:
callback = key.data
callback()
selector.unregister(key.fileobj)
#Unregister the event
这是我的代码。
我的目标是能够异步读写,所以我的想法是在同一个套接字上注册许多读写事件。
答案 0 :(得分:0)
您必须同时注册所有活动。
selector.register(sock.fileno(), selectors.EVENT_WRITE | selectors.EVENT_READ, write)
使用按位OR。请注意,您将在read()中遇到同样的问题,因为您在调用回调之前尚未注册FD。