selectors 非阻塞通讯

这篇博客介绍了如何使用Python的selectors模块实现非阻塞通信,以解决socket阻塞导致的并发问题。selectors作为事件注册中心,管理socket的读写事件。文中详细阐述了selectors的主要事件类型、工作流程,并提供了server.py和client.py的测试案例,通过select()方法不断检查并处理事件,实现了在一个线程中高效处理请求的目标。
摘要由CSDN通过智能技术生成

一.简介

使用socket 阻塞通讯时,当程序调用recv() 方法从socket 中读取数据时,如果没有读取到数据时,当前线程将会被阻塞,因此为了解决这个问题采用了多线程的方式,制约了服务器高并发的访问。

selectors 模块允许socket 以非阻塞的方式进行通信,selectors 相当于事件注册中心,程序只要将所有事件注册给selectors 管理,当selectors 检测到socket 中的特定事件后,程序就调用相关的监听方法进行处理。

selectors 主要支持两种事件:

selectors.EVENT_READ:当socket 有数据可读时触发该事件。当客户端连接进来时也会触发该事件。

selectors.EVENT_WRITE:当socket将要写数据时触发该事件。

selectors 官方参考文档: https://docs.python.org/3.6/library/selectors.html

二.流程

1.server.py

import socket,selectors,threading


server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', 8080))
server.listen()
server.setblocking(False)

sel = selectors.DefaultSelector()



def accept(sock,mask):
    print('accept------')
    conn,addr = sock.accept()
    conn.setblocking(False)
    sel.register(conn,se
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值