请稍候,加载中....

asyncore模块

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()
...

 

 


Python学习手册-