Python/selectors模块及队列

selectors模块是可以实现IO多路复用机制:

它具有根据平台选出最佳的IO多路机制,比如在win的系统上他默认的是select模式而在linux上它默认的epoll。

常用共分为三种:

select、poll、epoll

select的缺点:

1、每次调用都要将所有的文件描述符(fd)拷贝的内核空间,导致效率下降

2、遍历所有的文件描述符(fd)查看是否有数据访问

3、最大链接数限额(1024)

poll:

它就是select和epoll的过渡阶段,它没有最大链接数的限额

epoll:

1、第一个函数是创建一个epoll句柄,将所有的描述符(fd)拷贝到内核空间,但只拷贝一次。

2、回调函数,某一个函数或某一个动作成功完成之后会触发的函数为所有的描述符(fd)绑定一个回调函数,一旦有数据访问就是触发该回调函数,回调函数将(fd)放到链表中

3、函数判断链表是否为空

4、最大启动项没有限额

selsect实例:

 服务端
import selectors #基于select模块实现的IO多路复用,建议大家使用
import socket
sock=socket.socket()
sock.bind(('127.0.0.1',8800))
sock.listen(5)
sock.setblocking(False)
sel=selectors.DefaultSelector() #根据平台选择最佳的IO多路机制,比如linux就会选择epoll def read(conn,mask):
try:
data=conn.recv(1024)
print(data.decode('utf8'))
data2=input('>>>>')
conn.send(data2.encode('utf8'))
except Exception:
sel.unregister(conn) def accept(sock,mask):
conn,addr=sock.accept()
print('-------',conn)
sel.register(conn,selectors.EVENT_READ,read)
sel.register(sock, selectors.EVENT_READ, accept) #注册功能
while True:
print('wating....')
events=sel.select() #[(sock),(),()] 监听 for key,mask in events:
# print(key.data) #accept 找出有活动的绑定函数
# print(key.fileobj) #sock 找出有活动的文件描述符 func=key.data
obj=key.fileobj func(obj,mask) #1 accept(sock,mask) 2read(conn,mask)
------------------------------------------------------------------------------
客户端
import socket
tin=socket.socket()
tin.connect(('127.0.0.1',8800))
while True:
inp=input('>>>>')
tin.send(inp.encode('utf8'))
data=tin.recv(1024)
print(data.decode('utf8'))

队列:

队列分为(先进先出、后进先出)

队列是一个数据类型,可以进行数据储存功能

队列可以实现耦合的效果,比如有个人A把包子放到锅里,在有个人B把包子从锅里拿出来。现在的锅就是队列的效果。

实例如下:

 import queue
q=queue.Queue() #默认的先进先出
q.put(111) #往管道里放一个值
q.put(222) #往管道里放一个值
q.put(333) #往管道里放一个值 print(q.get()) #从管道里拿一个值
print(q.get()) #从管道里拿一个值
print(q.get()) #从管道里拿一个值
-----------------------------------------------
运行结果
111
222
333

join和tast_done

 import queue
q=queue.Queue() #默认的先进先出
q.put(111) #往管道里放一个值
q.task_done() #解除阻塞
q.put(222) #往管道里放一个值
q.task_done() #解除阻塞
q.put(333) #往管道里放一个值
q.task_done() #解除阻塞
q.join() #队列阻塞功能
print(q.get()) #从管道里拿一个值
print(q.get()) #从管道里拿一个值
print(q.get()) #从管道里拿一个值

join和tast_done 功能

如果有俩个put功能,在get的前边有join功能的话,在俩个put的后边要进行一个task_done才能执行。

生产者消费者模型:

在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。

生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

这就像,在餐厅,厨师做好菜,不需要直接和客户交流,而是交给前台,而客户去饭菜也不需要不找厨师,直接去前台领取即可,这也是一个结耦的过程。

 import time,random
import queue,threading q = queue.Queue() def Producer(name):
count = 0
while count <10:
print("making........")
time.sleep(random.randrange(3))
q.put(count)
print('Producer %s has produced %s baozi..' %(name, count))
count +=1
#q.task_done()
#q.join()
print("ok......")
def Consumer(name):
count = 0
while count <10:
time.sleep(random.randrange(4))
if not q.empty():
data = q.get()
#q.task_done()
#q.join()
print(data)
print('\033[32;1mConsumer %s has eat %s baozi...\033[0m' %(name, data))
else:
print("-----no baozi anymore----")
count +=1 p1 = threading.Thread(target=Producer, args=('A',))
c1 = threading.Thread(target=Consumer, args=('B',))
# c2 = threading.Thread(target=Consumer, args=('C',))
# c3 = threading.Thread(target=Consumer, args=('D',))
p1.start()
c1.start()
# c2.start()
# c3.start()

这个生产消费者就是通过列表的形式把输入和获取进行耦合操作!

Python/ selectors模块及队列的更多相关文章

  1. Python - selectors 模块

    selectors 模块 它的功能与 linux 的 epoll,还是 select 模块,  poll 等类似: 实现高效的 I/O multiplexing ,  常用于非阻塞的 socket  ...

  2. python selectors模块实现 IO多路复用机制的上传下载

    import selectorsimport socketimport os,time BASE_DIR = os.path.dirname(os.path.abspath(__file__))''' ...

  3. python多线程编程(6): 队列同步

    原文请看:http://www.cnblogs.com/holbrook/archive/2012/03/15/2398060.html 前面介绍了互斥锁和条件变量解决线程间的同步问题,并使用条件变量 ...

  4. Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块

    Python第十五天  datetime模块 time模块   thread模块  threading模块  Queue队列模块  multiprocessing模块  paramiko模块  fab ...

  5. Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures

    参考博客: https://www.cnblogs.com/xiao987334176/p/9046028.html 线程简述 什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线 ...

  6. (转)python异步编程--回调模型(selectors模块)

    原文:https://www.cnblogs.com/zzzlw/p/9384308.html#top 目录 0. 参考地址 1. 前言 2. 核心类 3. SelectSelector核心函数代码分 ...

  7. python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)

    昨日内容回顾 线程什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的 一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的在当 ...

  8. python异步编程--回调模型(selectors模块)

    目录 0. 参考地址 1. 前言 2. 核心类 3. SelectSelector核心函数代码分析 3.1 注册 3.2 注销 3.3 查询 4. 别名 5. 总结 6. 代码报错问题 1. 文件描述 ...

  9. python threading模块使用 以及python多线程操作的实践(使用Queue队列模块)

    今天花了近乎一天的时间研究python关于多线程的问题,查看了大量源码 自己也实践了一个生产消费者模型,所以把一天的收获总结一下. 由于GIL(Global Interpreter Lock)锁的关系 ...

随机推荐

  1. Git分支(3/5) -- 禁用 Fast Forward 合并

    添加一个分支, 并且换到该分支: git checkout -b add-text 然后我再index.html里面添加点文字, 并commit. 然后再修改README.md, 添加文字, comm ...

  2. Java设计模式(六)Adapter适配器模式

    一.场景描述 “仪器数据采集器”包含采集数据以及发送数据给服务器两行为,则可定义“仪器数据采集器”接口,定义两方法“采集数据capture”和“发送数据sendData”. “PDF文件数据采集器”实 ...

  3. Objective-C 中的 BOOL

    之前开发了一个针对单个数据模型,自动建表.增删改查等操作的 ORM 库,后边在 iPhone 5c 上使用时,出现了 crash 的情况. 该项目在 Github 开源,项目地址为SXJDatabas ...

  4. svn版本提交冲突问题解决详解

    svn冲突文件解决方法   工具/原料   svn客户端 方法/步骤   1 通过SVN客户端更新需要的文件,如果出现有感叹号的文件,找到出现感叹号的文件. 2 选择感叹号文件,即冲突文件,单击鼠标右 ...

  5. AVL树(Java实现)

    AVL树基本介绍 AVL树是一种自平衡的二叉查找树,在AVL树中任何节点的两个子树的高度差不能超过1.就是相当于在二叉搜索树的基础上,在插入和删除时进行了平衡处理. 不平衡的四种情况 LL:结构介绍 ...

  6. 深入理解Session与Cookie(一)

    Session,Cookie简介: Session和Cookie的作用都是为了保持用户与后端服务器的交互状态,但是各自都有缺陷: Cookie: 随着Cookie的个数的增多和访问量的增加,它占用的网 ...

  7. MySQL_执行计划详细说明

          1 简要说明 id 表格查询的顺序编号. 降序查看,id相同的从上到下查查看. id可以为null ,当table为( union ,m,n )类型的时候,id为null,这个时候,id的 ...

  8. [15单片机] STC15F104W开发入门及模拟串口程序

    STC15F104W开发入门及模拟串口程序 Saturday, 31. March 2018 09:42AM - beautifulzzzz 前言 最近找到一款51内核的SOP8封装的8脚单片机STC ...

  9. C语言程序设计(基础)- 第2周作业

    1.阅读提问的智慧,要求仔细阅读链接内容,用自己的话描述你的收获,并举例子说明应该如何提问. 2.所有同学请在自己电脑上配置git.编译器(win10 系统的话就Dev-C++).翻译软件,十一回校后 ...

  10. Beta Scrum Day 3

    听说