47异步编程_selectors
admin
2023-07-08 15:44:38
0

 

目录

异步编程:... 1

同步、异步:... 1

阻塞、非阻塞:... 2

同步、异步与阻塞、非阻塞区别:... 2

联系:... 2

IO模型... 2

py中的IO  multiplexing——selectors... 5

 

 

 

异步编程:

 

同步、异步:

你做完了,我才能做,同步,串行;我让你打饭,你不打好给我,我不走开,直到你打饭给了我;

你做你的,我做我的,异步,步调不一致;我让你打饭,你正打着,我不等你,但我会盯着你,你打完我过来拿走,异步并不保证多长时间打完饭;

 

函数或方法调用的时候,被调用者是否得到最终结果;

直接得到最终结果的,就是同步调用;

不直接得到最终结果的,就是异步调用;

某一方法是否在这个方法调用完时,是否能获得最终结果;

 

同步、异步区别:

同步,一直要执行到返回结果;

异步,直接返回了,但不是最终结果,调用者不能通过这种调用得到结果,还要通过被调用者,使用其它方式通知调用者,来取回最终结果;

 

 

阻塞、非阻塞:

函数或方法调用时,是否立刻返回;

不立即返回,就是阻塞调用;

立即返回,就是非阻塞调用;

time.sleep()event.wait()event.wait()要优于time.sleep()wait会主动让出时间片,其它线程可以被调度,而sleep会占用时间片不让出;

 

 

同步、异步与阻塞、非阻塞区别:

它们不相关;

同步、异步,强调的是结果;

阻塞、非阻塞强调的是时间,是否等待;

 

 

联系:

注:调用者、被调用者;

同步阻塞,我啥事不干,就等你打饭给我,打饭是结果,而且我啥事不干一直等;

同步非阻塞,我等着你打饭给我,但我可以玩手机、看电视,打饭是结果,但我不一直等;

异步阻塞,我要打饭,你说等叫号,并没有返回饭给我,我啥事不干,就等着饭好了你叫我,叫号;

异步非阻塞,我要打饭,你说等叫号,并没有返回饭给我,我在旁边玩手机、看电视,饭打好了你叫我;

 

 

IO模型

同步IO、异步IOIO多路复用:

IO过程分2阶段:

数据准备阶段,内核从输入设备读写数据(淘米、放锅里煮);

内核空间复制回用户进程缓冲区阶段,进程从内核复制数据(盛饭,从内核这个饭锅里把饭装到碗里来);

 

注:

sendfiledisk缓冲区-->内核缓冲区(网络缓冲区)-->发出;

0拷贝,网络缓冲区上有disk缓冲区的快捷方式,直接从disk缓冲区发出;

 

sync同步IO模型:

阻塞IO、非阻塞IOIO多路复用;

 

阻塞IOsync blocking IO

47异步编程_selectors

进程等待(阻塞),直到读写完成,全程等待;

 

非阻塞IOsync non-blocking IO

47异步编程_selectors

进程调用read操作,如果IO设备没有准备好,立即返回ERROR,进程不阻塞,用户可以再次发起系统调用,如果内核已准备好,就阻塞,然后复制数据到用户空间;

1阶段数据没有准备好,就先忙别的,等会再来看看,检查数据是否准备好了的过程是非阻塞;systemcall后返回的是异常,直到return OK

2阶段是阻塞(sync blocking)的,即内核空间和用户空间之间复制数据是阻塞的;

淘米、煮饭我不等,我去玩会,盛饭过程我等着你装好饭,但是要等到盛好饭才算完事,这是同步的,结果就是盛好饭;

 

IO多路复用,multiplexing

同时监控多个IO,有一个准备好了,就不需要等了,开始处理,提高同时处理IO的能力;同时多路在等,而不是等完一个再等下一个;2个阶段均是sync blocking

select,所有平台支持,pollselect的升级;

epolllinux kernel2.5+支持,对selectpoll的增强,在监视的基础上,增加回调机制(通知机制);BSDMACkqueuewiniocp

通常用multiplexing

47异步编程_selectors

select为例,将关注的IO操作告诉select函数并调用,进程阻塞,内核监视select关注的fd文件描述符,被关注的任何一个fd对应的IO准备好了数据,select返回,在使用read将数据复制到用户进程;

例,食堂供应很多菜(众多的IO),你需要吃某三菜一汤,大师傅(OS)说要现做,需要等,你只好等待,其中一样菜好了,大师傅叫你过来,你得自己找找看哪一样菜好了,请服务员把做好的菜打给你,而epoll是有菜准备好了,大师傅喊你去几号窗口直接打菜,不用自己找菜了;

 

async异步IO

linuxaio系统调用,从kernel version2.6开始支持;

47异步编程_selectors

2阶段都是异步,高并发时用;

进程发起异步IO请求,立即返回,内核完成IO的两个阶段,内核给进程发一个信号;

例,来打饭,跟大师傅说饭好了叫我,饭菜准备好了,窗口服务员把饭盛好了打电话叫你,两阶段都是异步的,在整个过程中,进程都可以忙别的,等好了才过来;

例,今天不想出去到饭店吃了,点外卖,饭菜在饭店做好了(第1阶段),快递员把饭送到你家门口(第2阶段);

 

 

 

py中的IO multiplexing——selectors

select库:

实现了selectpoll系统调用,部分实现了epoll

是底层的IO多路复用模块,类似网络编程的socket

 

开发中选择:

1、完全跨平台,使用selectpoll,但性能较差;

2、针对不同OS自行选择支持的技术,这样做会提高IO处理的性能;

 

selectors库:

py3.4提供,高级IO复用库;

 

类层次结构:

BaseSelector

         SelectSelector

         PollSelector

         EpollSelector

         DevpollSelector

         KqueueSelector

 

selectors.DefaultSelector(),返回当前平台最有效、性能最高的实现;

但,此库没有实现winiocp,将自动退化为select

 

 

class BaseSelector(metaclass=ABCMeta):

    @abstractmethod

    def register(self, fileobj, events, data=None):   #fileobj,被监视文件对象,如socket对象;events,该文件对象必须等待的事件;data,可选,与此文件对象相关联的不透明数据,如,可用来存储每个客户端的会话ID,本例中关联方法,就是让selector干什么事,可以是任意对象,如果是函数类似回调

 

events常量:

EVENT_READ,可读0x01,内核已准备好输入输出设备,可以开始读了;

EVENT_WRITE,可写0x10,内核已准备好,可以往里写了;

 

注:

# generic events, that must be mapped to implementation-specific ones

EVENT_READ = (1 << 0)

EVENT_WRITE = (1 << 1)

 

单线程+selectors,单线程下用selectors而不用多线程,条件不满足不能转为就绪态,则不会被cpu调度;

多线程+阻塞,在OS中多了线程资源而已;

selectors可解决网络IO、文件IO

 

 

例:

selector = selectors.DefaultSelector()

 

def accept(sock: socket.socket):

    conn, addrinfo = sock.accept()

    conn.setblocking(False)

    selector.register(conn, selectors.EVENT_READ, recv)

 

def recv(conn: socket.socket):

    data = conn.recv(1024).strip().decode()

    print(data)

    msg = 'ack: {}'.format(data)

    conn.send(msg.encode())

 

sock = socket.socket()

addr = ('127.0.0.1', 9999)

sock.bind(addr)

sock.listen()

sock.setblocking(False)

 

e = threading.Event()

 

key = selector.register(sock, selectors.EVENT_READ, accept)

print(key)

 

while not e.is_set():

    events = selector.select()

    if events:

        print(type(events))

                   print(events)

    for key,mask in events:

        print(key, mask)

        callback = key.data

        callback(key.fileobj)

输出:

SelectorKey(fileobj=, fd=172, events=1, data=)

[(SelectorKey(fileobj=, fd=172, events=1, data=), 1)]

SelectorKey(fileobj=, fd=172, events=1, data=) 1

[(SelectorKey(fileobj=, fd=216, events=1, data=), 1)]

SelectorKey(fileobj=, fd=216, events=1, data=) 1

nimeide

 

 

例:

ChatServer改为IO多路复用方式;

 

注:

if mask == selectors.EVENT_READ:   #不严格

if (mask & selectors.EVENT_READ) == selectors.EVENT_READ:   #严格写法,如果rw同时满足,进来3则不作处理

 

 

 

 


相关内容

热门资讯

美前副总统:共和党失去了方向,... 2026年是美国的中期选举年,共和党选情不利,可能在年底的选举中遭遇挫败。美国前副总统彭斯5月31日...
南枝原来去过中国?《给阿嬷的情... 《给阿嬷的情书》票房口碑双丰收,目前票房已突破13亿。凤凰卫视最新一期《问答神州》专访了该片导演蓝鸿...
法国海军扣押一艘俄“影子舰队”... 近日,法国海军在大西洋海域扣押了一艘据称从俄罗斯摩尔曼斯克出发的油轮,引发俄方强烈不满。俄新社6月1...
凤凰晚报丨面粉染头模仿黄仁勋,... 今日人物【面粉染头模仿黄仁勋,农村青年走红后称遭“法务”警告】“先赔偿5000元肖像侵权使用费,再删...
亲特朗普极右派候选人领跑哥伦比... 【文/观察者网 熊超然】当地时间5月31日,哥伦比亚总统选举拉开帷幕,首轮投票计票工作已完成逾99%...
2026年度网络举报系列宣传活... 5月28日至29日,以“每一件举报,都是共治的力量——豫你e行 同心护网”为主题的2026年度网络举...
中原首例帝企鹅DNA性别鉴定!... 近日,郑州海昌海洋公园正式对外公布中原首对人工繁育的帝企鹅萌宝的DNA性别鉴定报告。这是中原首个将 ...
我国科学家为细胞信号“导航”开... 新华社济南5月31日电(记者张力元)人体细胞犹如一座精密的通信城市,每天都有大量“指令”穿梭传递,调...
极端大风突袭哈尔滨!过山车停摆... 极目新闻记者 詹钘5月31日,受强对流天气影响,哈尔滨国际会展中心体育场相关设施受到损坏,原计划当晚...
三原电缆取得电缆接头连接用防护... 国家知识产权局信息显示,上海三原电缆附件有限公司取得一项名为“一种电缆接头连接用防护结构”的专利,授...