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

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • BigDecimal 除法

    BigDecimal 除法文章目录BigDecimal除法除法常用方法示例舍入模式ROUND_UPROUND_DOWNROUND_CEILINGROUND_FLOORROUND_HALF_UPROUND_HALF_DOWNROUND_HALF_EVENROUND_UNNECESSARYBigDecimal除法除法常用方法divide(BigDecimaldivisor,intscale,introundingMode)参数释义divisor被除数scale保留小数位roun

  • SpringBoot笔记(五)Linux系统与项目部署

    SpringBoot笔记(五)Linux系统与项目部署Linux操作系统与项目部署**注意:**本版块会涉及到操作系统相关知识。现在,几乎所有智能设备都有一个自己的操作系统,比如我们的家用个人电脑,基本都是预装Windows操作系统,我们的手机也有Android和iOS操作系统,还有程序员比较青睐的MacBook,预装MacOS操作系统,甚至连Macbook的Touchbar都有一个自己的小型操作系统。操作系统是管理计算机硬件与软件资源的计算机程序,操作系统可以对计算机系统的各项资源板块开展调度工作,运用计算机操作系统可以减少人工资源分配的工作强度。.

  • Anycast

    AnycastAliDNS(www.alidns.com)近期上线。看到同事说更换localDNS后,访问淘宝明显快了。以我当前的理解能力,认为无非是快在DNS解析这一步上,缩短的时间应该在毫秒级别,而浏览器与淘宝集群之间的延时应该不会有变化。但试了后,果然明显感觉变快了。好奇心驱使,学习了下Anycast技术。当然,AliDNS还采用了集群缓存共享的设计…

  • 回发或回调参数无效。在配置中使用 <pages enableEventValidation=”true”/> 或在页面中使用 <%@ Page EnableEventValidation=”true”

    回发或回调参数无效。在配置中使用 <pages enableEventValidation=”true”/> 或在页面中使用 <%@ Page EnableEventValidation=”true”回发或回调参数无效。在配置中使用或在页面中使用启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用ClientScriptManager.RegisterForEventValidation方法来注册回发或回调数据以进行验证。这两天写程序总是遇到相似的程序在不同页面,出现不一样的结果。以下是

  • 图像处理算法 面试题

    图像处理算法 面试题1、常用边缘检测有哪些算子,各有什么特性?解:常用边缘检测算子如下所述:Sobel算子其主要用于边缘检测,在技术上它是以离散型的差分算子,用来运算图像亮度函数的梯度的近似值,Sobel算子是典型的基于一阶导数的边缘检测算子,由于该算子中引入了类似局部平均的运算,因此对噪声具有平滑作用,能很好的消除噪声的影响。Sobel算子对于象素的位置的影响做了加权,与Prewitt算子、Ro…

  • IIS7 出现HTTP 500内部服务器错误解决方案[通俗易懂]

    IIS7 出现HTTP 500内部服务器错误解决方案[通俗易懂]2019独角兽企业重金招聘Python工程师标准>>>…

发表回复

您的电子邮箱地址不会被公开。

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