asyncore是基于事件的异步处理器,适合于需要并发又不希望基于多线程或者多进程的场景中使用,该模块所有功能由dispatcher类实现
导入dispatcher类
from asyncore import dispatcher
dispatcher类实例化
d = dispatcher([sock])
实例化时,可以传入一个已有的socket
对象,如果没有传入socket
对象,那么需要使用create_socket
方法创建一个socket
对象
dispatcher实例方法需要在子类中实现
dispatcher类实例方法
方法名 | 说明 |
handle_accpet() | 收到新的socket连接时调用此方法 |
handle_close() | 关闭套接字时调用该方法 |
handle_connect() | 连接时调用此方法 |
handle_error() | 发生未捕获的异常调用此方法 |
handle_expt() | 收到套接字带外数据OOB时调用此方法 |
handle_read() | 可以从套接字读取数据时使用此方法 |
handle_write() | 尝试写入数据时调用此方法 |
readable() | select()循环检查对象是否准备好读取数据,如果是为True,否则为False |
writeable() | select()循环检查对象是否准备好写入数据,如果是为True,否则为False |
accpet() | 相当于socket.accept() |
bind() | 相当于socket.bind() |
close() | 相当于socket.close() |
connect() | 相当于socket.connect() |
create_socket() | 相当于socket() |
listen() | 相当于socket.listen() |
recv() | 相当于socket.recv() |
send() | 相当于socket.send() |
启动事件循环asyncore.loop函数
asyncore.
loop
([timeout[, use_poll[, map[, count]]]])
进入一个轮询循环,其在循环计数超出或所有打开的通道关闭后终止。 所有参数都是可选的。
- timeout - select()超时,默认30s
- use_poll - 如果为True,则优先使用poll()
- map - 字典类型,所有要监测的通道
- count 形参默认为
None
,表示循环仅在所有通道关闭时终止.
asyncore示例
async_http是asyncore.dispatcher的子类,在async_http中实现dispatcher实例方法
class async_http(asyncore.dispatcher):
def __init__(self, port):
super().__init__()
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.bind(("", port))
self.listen(5)
def handle_accept(self):
client, addr = self.accept()
return async_http_handle(client)
class async_http_handle(asyncore.dispatcher):
def __init__(self, sock=None):
super().__init__(sock)
self.got_request = False
self.request_data = b""
self.write_queue = collections.deque()
def readable(self):
return not self.got_request
def handle_read(self):
chunk = self.recv(8192)
self.request_data += chunk
if b'\r\n\r\n' in self.request_data:
self.handle_request()
...
讨论区