zoukankan      html  css  js  c++  java
  • Pyhton学习——Day36

    #异步IO——Asynchronous
    #异步效率最高,特点:全程无阻塞
    # 在说明synchronous IO和asynchronous IO的区别之前,需要先给出两者的定义。
    # Stevens给出的定义(其实是POSIX的定义)是这样子的:
    # A synchronous I/O operation causes the requesting process to be blocked until that I/O operationcompletes;
    # 一个I/O操作会被阻塞,直到该I/O操作结束
    #阻塞IO和非阻塞IO都是同步的状态,只是阻塞的位置不同,阻塞IO阻塞在IO操作部分(内核的数据接收处),
    # 非阻塞IO阻塞在拷贝数据(内核的数据拷贝处)#
    # An asynchronous I/O operation does not cause the requesting process to be blocked;
    # epoll实际上是伪异步
    #——————————————各个IO操作比较——————————————————————————#
    # 阻塞IO:从开始到结束全程阻塞
    # 非阻塞IO:当有数据输入至内核时,内核提取数据处阻塞
    # IO多路复用:监听的socket对象有内容时,发现有内容前用select阻塞,发现有内容后在接收信息accept处再阻塞一次
    # 异步IO:从开始到信号通知无任何阻塞(接收数据——发出通知——拷贝数据——直接调用)
    #—————————————————Server—————————————————————————#
    # 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):
    # try:
    # data = conn.recv(1000) # Should be ready
    # if not data:
    # raise Exception
    # print('echoing', repr(data), 'to', conn)
    # conn.send(data) # Hope it won't block
    # except Exception as e:
    # print('closing', conn)
    # sel.unregister(conn)
    # conn.close()
    # sock = socket.socket()
    # sock.bind(('192.168.55.1', 8000))
    # sock.listen(100)
    # sock.setblocking(False)
    # sel.register(sock, selectors.EVENT_READ, accept) #register相当于注册,和accept绑定
    # while True: #监听
    # print('Server Start')
    # events = sel.select()
    # print('events',events)
    # for key, mask in events:
    # callback = key.data
    # callback(key.fileobj, mask)
    #—————————————————Server—————————————————————————#
    #—————————————————Client—————————————————————————#
    # import socket
    # sk = socket.socket()
    # sk.connect(('192.168.55.1',8000))
    # while 1:
    # inp = input('>>>')
    # sk.send(inp.encode('utf-8'))
    # data = sk.recv(1024)
    # print(data.decode('utf-8'))
    #—————————————————Client—————————————————————————#
    #—————————————————总结———————————————————————————#
    # IO模型,内存空间是整体,不能分割,只能在操作系统层面操作区分内存空间,内核的状态位表示0和1,
    # 状态位为0的是内核态,可操作所有的指令集;状态位为1的是用户态,只有部分指令集可以操作
    # 进程切换需要消耗大量的资源
    # 阻塞:当进程进入阻塞状态时,是不占用CPU的
    # 文件描述符:本身就是操作系统的一个记录表,server的sk接收后,会记录变化到记录表中,socket本身就是一个文件描述符
    # 缓存I/O:发送数据和接收数据都会经过两个操作系统,发送数据是先发给自己的操作系统内核,通过网卡发送给对方的操作系统内核,
    # 对方的操作系统内核再发送给用户
    # 阻塞IO:全程阻塞,且一次系统调用
    # 非阻塞IO:反复监听,过一段时间监听一次,其余时间CPU可以处理其他功能,如果接收了数据,就要等内核拷贝数据去用户区
    # IO多路复用:用select进行监听,接收到数据后,调用accept接收数据,全程阻塞,但是数据已经拷贝指内核区,可以直接调用
    # 但是select支持多链接监听,可以监听多个socket文件描述符
    # 阻塞IO和非阻塞IO的区别:全程阻塞和非监听部分阻塞
    # 同步IO和非同步IO的区别:存在阻塞就是同步IO,不存在阻塞就是异步IO
    # select是水平触发
    #——————————————————————————————————————————————————#
    # 作业:基于selectors模块实现并发的FTP







    Win a contest, win a challenge
  • 相关阅读:
    axios+post获取并下载后台返回的二进制流
    vue+ckEditor5
    金额大写转换(改进版)
    vue+axios请求头封装
    移动端h5+vue失焦搜索,ios和android兼容问题
    vue滚动+滑动删除标记(移动端)仿qq/微信
    重置 centos 7 密码
    发现好玩的——github + git 有意思的用法
    github 中使用 issues
    java代理模式与装饰模式
  • 原文地址:https://www.cnblogs.com/pandaboy1123/p/8594611.html
Copyright © 2011-2022 走看看