怎么使用Selector传参数?
时间: 2024-05-12 20:14:54 浏览: 129
Prototype Selector对象学习
在使用Selector传递参数时,可以使用Selector的register()方法来注册回调函数,并将参数作为关键字参数传递。例如:
```python
import selectors
import socket
def accept_wrapper(sock, selector):
conn, addr = sock.accept() # 接受连接
print(f"Accepted connection from {addr}")
conn.setblocking(False) # 将连接设置为非阻塞模式
# 注册回调函数并传递参数
selector.register(conn, selectors.EVENT_READ, read_wrapper, conn)
def read_wrapper(conn, selector):
data = conn.recv(1024) # 读取数据
if data:
print(f"Received data from {conn.getpeername()}: {data.decode()}")
else:
print(f"Closing connection from {conn.getpeername()}")
selector.unregister(conn)
conn.close()
# 创建一个Selector对象
selector = selectors.DefaultSelector()
# 创建一个socket对象并绑定到指定地址和端口
server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sock.bind(('localhost', 8888))
server_sock.listen()
# 将socket对象注册到Selector中,并设置回调函数
selector.register(server_sock, selectors.EVENT_READ, accept_wrapper, selector)
while True:
events = selector.select() # 阻塞等待事件发生
for key, _ in events:
callback = key.data # 获取回调函数
callback(key.fileobj, selector, **key.kwargs) # 调用回调函数并传递参数
```
在上面的例子中,我们在accept_wrapper()方法中注册了read_wrapper()方法,并将连接对象conn作为参数传递。在read_wrapper()方法中,我们可以通过关键字参数conn获取连接对象,并使用它读取数据。注意,在调用回调函数时,需要将SelectorKey对象的kwargs属性作为关键字参数传递给回调函数,以便获取参数。
阅读全文