并发编程 之 线程的队列, 线程池; 以及协程
Posted fushengliangnian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发编程 之 线程的队列, 线程池; 以及协程 相关的知识,希望对你有一定的参考价值。
线程:
队列:Queue
from queue import Queue
特点:
先进先出
自带锁, 数据安全
方法:
put() 添加
get() 获取
put_nowait()
get_nowait()
full()
empty()
qsize()
和普通的队列用法一样, 详情 请看 进程之队列
栈:LifoQueue
from queue import LifoQueue
后进先出
自带锁, 数据安全
优先级队列:PriorityQueue
from queue import PriorityQueue
put((tulp)) 参数接受一个元组, 该元组为两个元素, 第一个表示优先级的int, int越小优先级越大
线程池: from concurrent.futures import ThreadPoolExecutor
1, threading 里没有 线程池相关的内容, 在后面的时候,有人写了一个 concurrent.futures来帮助我们管理 线程/进程 池
concurrent.futures模块中的进程池和线程池
高度封装
进程/线程池 的统一使用方式:
协程:
简介:在一条线程的基础上,在多个任务之间互相切换
节省线程开启的时间消耗, 且协程是从python代码级别进行调度的.
yield:
1, yield 与 next() 与send() 的配合 就是一个最基础的协程.
2, 只做到了程序之间的切换,没有重利用任何IO操作的时间
第三方模块: greenlen
from greenlet import greenlet
此模块是用来帮助我们来进行协程之间的转换.
方法:
switch() 切换
第三方模块: gevent
import gevent
此模块是基于greenlen模块开发的一个自动遇见阻塞则切换的模块( 此乃神器)
同时 此机制, 充分利用了 IO操作产生的空闲时间. 使得程序更快
spawn(fu) 将fu函数 设置为协程
sleep() 堵塞
join() 堵塞
joinall([list]) 等待列表中的 协程全部执行完毕后解除堵塞.
注意: gevent 只认识自己的堵塞状态, 若想让其认识其他的需要借助 monkey
帮助gevent 认识其他阻塞: monkey.patch_all()
from gevent import monkey;monkey.patch_all() 写在其他模块导入之前
monkey.patch_all() 是将下面所有模块的堵塞状态进行记录
1 # 使用协程减少IO操作带来的时间消耗 2 from gevent import monkey;monkey.patch_all() 3 import gevent 4 import time 5 6 def eat(): 7 print(‘吃‘) 8 time.sleep(2) 9 print(‘吃完了‘) 10 11 def play(): 12 print(‘玩儿‘) 13 time.sleep(1) 14 print(‘玩儿美了‘) 15 16 g1 = gevent.spawn(eat) 17 g2 = gevent.spawn(play) 18 gevent.joinall([g1,g2]) 19 # g1.join() 20 # g2.join() 21 # 没执行 22 # 为什么没执行???是需要开启么? 23 # 没有开启但是切换了 24 # gevent帮你做了切换,做切换是有条件的,遇到IO才切换 25 # gevent不认识除了gevent这个模块内以外的IO操作 26 # 使用join可以一直阻塞直到协程任务完成 27 # 帮助gevent来认识其他模块中的阻塞 28 # from gevent import monkey;monkey.patch_all()写在其他模块导入之前
以上是关于并发编程 之 线程的队列, 线程池; 以及协程 的主要内容,如果未能解决你的问题,请参考以下文章
JUC并发编程 共享模式之工具 线程池 -- 自定义线程池(阻塞队列)
JUC并发编程 共享模式之工具 ThreadPoolExecutor -- 任务调度线程池 定时任务 / 延时执行(ScheduledThreadPoolExecutor 延时执行 / 定时执行)(代