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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql——cmd进入mysql及常用的mysql操作[通俗易懂]

    mysql——cmd进入mysql及常用的mysql操作[通俗易懂]cmd进入mysql操作win+R,输入cmd,打开cmd窗口,进入到mysqlbin目录的路径下第一步:启动mysql服务,可以通过“netstartmyql”命令实现;第二步:先使用DOS命令进入mysql的安装目录下的bin目录中;第三步:在命令行输入:mysql-u用户名-p密码;回车;-h表示服务器名,localhost表示本地,-hlocalhost可不输入;-u为数据库用户名,root是mysql默认用户名;-p为密码,如果设置了密码,可直接在-p后链接输入,如

    2022年6月9日
    36
  • 官网下载mysql连接驱动jar包教程「建议收藏」

    官网下载mysql连接驱动jar包教程「建议收藏」1.网址上输入mysql.com后回车2.点击如图所示3.滑下来找到如图所示并点击4.进来后,点击如图所示5.选择不同版本5.1下载最新版本的,如图按步骤点击5.2下载其他版本点击这个6.点击后下载第二个7.点击后,点击如下,几秒后即可完成下载,(有时候第6步就直接下载了,就不需要这步了)8.下载完后解压,找到如下文件,这就是ja…

    2022年5月11日
    40
  • python+pycharm安装_pycharm安装教程2020

    python+pycharm安装_pycharm安装教程2020python与pycharm的下载与安装前言一、python的下载安装1.python的下载2.python的安装二、Pycharm的下载安装1.Pycharm的下载2.Pycharm的安装三、python与pycharm的安装包总结前言本文将会介绍python的下载,安装,pycharm的下载,安装,激活,以及一些注意事项一、python的下载安装1.python的下载https://www.python.org/这里直接给出python的官方网站(注:有些同学可能打不开网站,..

    2022年8月27日
    2
  • mmc卡和sd卡区别「建议收藏」

    mmc卡和sd卡区别「建议收藏」转载:https://zhidao.baidu.com/question/296690750.html区别:1、尺寸不同:SD卡的技术是基于MultiMedia卡(MMC)格式上发展而来,大小和MMC卡差不多,尺寸为32mmx24mmx2.1mm。长宽和MMC卡一样,只是比MMC卡厚了0.7mm,以容纳更大容量的存贮单元。2、兼容性不同:SD卡与MMC卡保持着向上兼容,…

    2022年6月11日
    32
  • pycharm 安装 cv2 遇到的坑[通俗易懂]

    pycharm 安装 cv2 遇到的坑[通俗易懂]网上找了很多教程都没成功!window764位系统python3.6pycharmctrl+alt+s 找到opencv-python直接安装 完全没问题。

    2022年8月28日
    1
  • 数字游戏13524_数位计数器

    数字游戏13524_数位计数器由于科协里最近真的很流行数字游戏。某人又命名了一种取模数,这种数字必须满足各位数字之和 mod N 为 0。现在大家又要玩游戏了,指定一个整数闭区间 [a.b],问这个区间内有多少个取模数。输入格式输入包含多组测试数据,每组数据占一行。每组数据包含三个整数 a,b,N。输出格式对于每个测试数据输出一行结果,表示区间内各位数字和 mod N 为 0 的数的个数。数据范围1≤a,b≤231−1,1≤N<100输入样例:1 19 9输出样例:2#include<bits

    2022年8月9日
    3

发表回复

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

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