python库之selectors

在之前的博客中已经总结过分别在windows和linux操作系统下实现socket高并发(I/O异步)的方法,可以参考基于epoll的TP传输层实现和Windows之IOCP下面对Python中实现

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

  在之前的博客中已经总结过分别在windows和linux操作系统下实现socket高并发(I/O异步)的方法,可以参考基于epoll的TP传输层实现Windows之IOCP

  下面对Python中实现socket高并发的selectors库进行总结,官方参考文档:https://docs.python.org/3/library/selectors.html 

1. 示例代码

import selectors
import socket

sel = selectors.DefaultSelector()

def accept(sock, mask):
    conn, addr = sock.accept()  # Should be ready
    print('accepted', conn, 'from', addr)
    conn.setblocking(False)
    sel.register(conn, selectors.EVENT_READ, read)

def read(conn, mask):
    data = conn.recv(1000)  # Should be ready
    if data:
        print('echoing', repr(data), 'to', conn)
        conn.send(data)  # Hope it won't block
    else:
        print('closing', conn)
        sel.unregister(conn)
        conn.close()

sock = socket.socket()
sock.bind(('localhost', 1234))
sock.listen(100)
sock.setblocking(False)
sel.register(sock, selectors.EVENT_READ, accept)

while True:
    events = sel.select()
    for key, mask in events:
        callback = key.data
        callback(key.fileobj, mask)

   上面示例代码来自官方文档,接下来对关键代码进行重点说明

2. 重点知识说明

(1)conn.setblocking(False)

  设置socket的阻塞或非阻塞模式

  阻塞模式下当试图对该文件描述符进行读写时,如果当时没有东西可读,或者暂时不可写,程序就进入等待状态,直到有东西可读或者可写为止

  非阻塞模式下如果没有东西可读,或者不可写,读写函数马上返回,而不会等待

(2)sel.register(conn, selectors.EVENT_READ, read)

  对描述符进行注册,也就是对该描述符的EVENT_READ事件进行监听,当又READ事件通知时,调用回调函数read

  selectors库提供了两个监听事件:EVENT_READ和EVENT_WRITE

(3)sel.unregister(conn)

  注销描述符

(4)events = sel.select()

  函数原型为:abstractmethod select(timeout=None)

  该函数是实现I/O异步的关键,等待,直到一些已注册的文件对象准备就绪,或者超时。

  如果timeout>0,则指定最大等待时间,以秒为单位,如果超时没有,则调用将阻塞,直到被监视的文件对象准备就绪。如果timeout< 0,调用将不会阻塞,并将报告当前就绪的文件对象。

  该函数返回一个元组(key, events)

  key为class selectors.SelectorKey对象,SelectorKey = namedtuple(‘SelectorKey’, [‘fileobj’, ‘fd’, ‘events’, ‘data’])

  fileobj为注册的文件对象

  fd为文件描述符

  data为与文件对象相关联的自定义数据,如上面的回调函数

  明确上面的4个知识点后会觉得selectors库的使用很简单

  最后对DefaultSelector进行说明,DefaultSelector会根据当前操作系统类型自己选择selector类型

if 'KqueueSelector' in globals():
    DefaultSelector = KqueueSelector
elif 'EpollSelector' in globals():
    DefaultSelector = EpollSelector
elif 'DevpollSelector' in globals():
    DefaultSelector = DevpollSelector
elif 'PollSelector' in globals():
    DefaultSelector = PollSelector
else:
    DefaultSelector = SelectSelector

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120068.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月29日 下午3:00
下一篇 2021年12月29日 下午4:00


相关推荐

  • maven使用入门[通俗易懂]

    maven使用入门[通俗易懂]maven面临的问题一个项目就是一个工程。如果项目非常大,最好是每一个模块对应一个工程。借助maven可以将一个项目拆分成多个工程项目中需要的jar必须要手动”复制”,”粘贴”到WEB-INF/lib目录下,带来的问题是:同样的jar包文件重复出现在不同的项目工程中,浪费空间。maven可以将jar仅仅保存在”仓库”中,有需要使用的工程”引用”这个文件接口,并不需要真的把jar包复制过来jar包需要别人替我们准备好,或到官网下载。不同技术的官网提供jar包下载的形式是五花八门的,有些技术的官网就是

    2022年8月8日
    7
  • Linq语法详细

    Linq语法详细每一种搜索结果集 我都以三种方式变现出来 为了更好的理解 1 简单的 linq 语法 1varss fromrindb Am recProScheme 2varss1 db Am recProScheme 3stringsssql select fromAm recProScheme

    2026年3月16日
    2
  • 最新扣子(Coze)案例教程:爆款毛姆人间清醒哲学语录,Coze+Deepseek工作流,100篇头条图文秒生成,完全免费教程

    最新扣子(Coze)案例教程:爆款毛姆人间清醒哲学语录,Coze+Deepseek工作流,100篇头条图文秒生成,完全免费教程

    2026年3月12日
    2
  • 动态路由协议简单理解

    动态路由协议简单理解一 什么是路由 nbsp nbsp nbsp nbsp nbsp nbsp 在一个网络中 路由是一个非常基本的概念 当路由器 或者其他三层设备 收到一个 IP 数据包 路由器会找出报文中的 IP 头里的目的 IP 地址 然后拿着目的 IP 地址到自己的路由表中进行查找 找到 最匹配 的路由条目后 将数据包根据路由条目所指示的出接口或下一跳 IP 转发出去 随着网络路由的发展 路由的种类有很多 如静态路由 动态路由 缺省路由等 二 路由协议的分类 nbsp nbsp nbsp nbsp nbsp amp nb

    2026年3月19日
    2
  • swal弹窗_swal() 弹出层的用法

    swal弹窗_swal() 弹出层的用法swal 方法是一个提示框 swal title text 请扫描用户手机上的付款码 type input showCancelBu true closeOnConfi false cancelButton 取消 confirmButto 确认 imageUrl assets images icon scancode gi

    2026年3月18日
    2
  • matlab中表示拉普拉斯分布_拉普拉斯分布的随机数[通俗易懂]

    matlab中表示拉普拉斯分布_拉普拉斯分布的随机数[通俗易懂]一、功能产生拉普拉斯分布的随机数。二、方法简介1、产生随机变量的组合法将分布函数\(F(x)\)分解为若干个较为简单的子分布函数的线性组合\[F(x)=\sum_{i=1}^{K}p_{i}F_{i}(x)\]其中$p_{i}>0\(\foralli)$,且$\sum_{i=1}^{K}p_{i}=1$,\(F(x)\)是分布函数。定理若随机变量\(\xi\sim…

    2025年7月5日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号