asyncio模块中AbstractEventLoop的create_server方法工作原理探究
嘿,我来给你唠唠这个方法到底是怎么运作的~它本质上是asyncio里创建TCP服务器的核心入口,把监听端口、处理连接这些底层繁琐操作都封装好了,咱们一步步拆解:
参数准备与校验
首先它会处理你传入的参数,最关键的就是protocol_factory——这是一个无参可调用对象(比如lambda或者类构造函数),用来给每个新连接生成对应的Protocol实例,后续这个连接的所有读写逻辑都靠这个实例处理。另外它还会解析host、port(确定监听的地址和端口)、backlog(监听队列的最大长度,默认100)这些参数:要是传port=0,系统会自动分配空闲端口;host=None的话就监听所有可用网络接口。套接字创建与绑定
方法内部会创建一个TCP套接字,接着设置常用的套接字选项(比如SO_REUSEADDR,避免程序重启后端口被占用的问题),然后把这个套接字绑定到你指定的host和port上。这一步完成后,套接字就和目标地址绑定好,准备接收连接了。启动监听与事件注册
调用套接字的listen()方法,让它进入监听状态,最多能容纳backlog个待处理的连接请求。之后,这个监听套接字会被注册到事件循环的读事件上——事件循环会一直盯着这个套接字,一旦有客户端发起连接(也就是套接字变成可读状态),就会触发对应的回调函数。处理新连接
当有客户端连接进来时,事件循环会调用accept()方法接受连接,得到新的客户端套接字和客户端地址。紧接着调用你传入的protocol_factory生成一个Protocol实例,把新套接字和这个实例绑定在一起,事件循环会负责后续监听这个客户端套接字的读写事件,所有和客户端的通信逻辑(比如接收数据、发送响应)都由Protocol实例的方法(比如data_received())来处理。返回Server对象
最后这个方法会返回一个asyncio.Server对象,你可以用它管理服务器:比如调用close()方法关闭服务器,或者用await wait_closed()等待服务器完全关闭、释放所有资源。
另外要注意,create_server是一个协程函数,你必须用await来调用它,不然它不会真正执行。
内容的提问来源于stack exchange,提问作者Jason Zhou

