python全栈开发 * 线程队列 线程池 协程 * 180731
一.线程队列
队列:
1.Queue
先进先出
自带锁 数据安全
from queue import Queue
from multiprocessing import Queue (IPC队列)
2.LifoQueue后进先出
后进先出
自带锁 数据安全
from queue import LifoQueue
lq=LifoQueue(5)
lq.put(123)
lq.put(666)
lq.put(888)
lq.put(999)
lq.put("love")
print(lq.put_nowait("miss")) #报错 queue.Full
print(lq) # <queue.LifoQueue object at 0x0000017901BC8C88>
print(lq.get()) #love
print(lq.get()) #
print(lq.get()) #
print(lq.get()) #
print(lq.get()) #
#print(lq.get_nowait()) #报错 queue.Empty
3.PriorityQueue优先级队列
(放元组,数字从小到大,英文字母按ASCII码先后顺序)
from queue import PriorityQueue
pq=PriorityQueue(4)
pq.put((10,"aaa"))
pq.put((5,"S"))
pq.put((5,"ccc"))
pq.put((10,"zzz")) #pq.put_nowait((10,"bbb")) #报错queue.Full
print(pq) # <queue.PriorityQueue object at 0x000001D6FEF38C50> print(pq.get())
print(pq.get()) #(5, 'ccc')
print(pq.get()) #(10, 'aaa')
print(pq.get()) #(10, 'zzz')
print(pq.get()) #(20, 'bbb')
# print(pq.get_nowait()) # 报错queue.Empty
二 线程池
Multiprocessing模块 自带进程池Pool
Threading 模块 没有Pool(没有线程池)
concurrent.futures帮助你管理线程池和进程池
高度封装
进程池/线程池的统一的统一的使用方法
import time
from threading import currentThread
from concurrent.futures import ProcessPoolExecutor
from concurrent.futures import ThreadPoolExecutor
def func(i):
time.sleep(1)
print("in %s %s"%(i,currentThread()))
return i**2
def back(fn):
print(fn.result(),currentThread()) t=ThreadPoolExecutor(5)
ret_l=[]
for i in range(20):
ret=t.submit(func,i).add_done_callback(back)
# ret_l.append(ret)
t.shutdown(wait=True) #括号里可以省略
# for ret in ret_l:
# print(ret.result())
print(666)
ThreadPoolExecutor的相关方法:
1.t.map方法 启动多线程任务 # t.map(func,range(20)) 替代for submit
2.t.submit(func,*args,**kwargs) 异步提交任务
3.t.shutdown (wait=True) 相当于进程池的pool.close()+pool.join()操作 同步控制
wait=True,等待池内所有任务执行完毕回收完资源后才继续
wait=False,立即返回,并不会等待池内的任务执行完毕
submit和map必须在shutdown之前
4.result获取结果 ret.result()
5.回调函数 add_done_callback(back)
在回调函数内接收的参数是一个对象,需要通过result来获取返回值
在主进程中执行
三.协程
进程:资源分配的最小单位
线程 :CPU调度的最小单位
协程: 能在一条线程的基础上,在多个任务之间互相切换
节省线程开启的消耗
从python代码的级别调度
正常的线程是CPU调度的最小单位
协程的调度并不是由操作系统来完成的.
(一).yield的机制就是协程
def func():
print(1)
x=yield "aaa"
print(x)
yield "bbb"
g=func()
print(next(g))
print(g.send("***"))
(二).在多个函数之间互相切换的功能--协程
def consumer():
while True:
x=yield
print(x) def producer():
g=consumer()
next(g) for i in range(10):
g.send(i)
producer()
yeild 只有程序之间的切换,没有重利用任何IO操作的时间
greenlet(第三方模块) 程序上下文切换
cmd : pip3 install 模块名 安装第三方模块
(三).greenlet
协程模块 单纯的程序切换耗费时间
import time
from greenlet import greenlet
def eat():
print('吃')
time.sleep(1)
g2.switch()
print("吃完了")
time.sleep(1)
g2.switch() def play():
print("玩")
time.sleep(1)
g1.switch()
print("玩美了") g1=greenlet(eat)
g2=greenlet(play)
g1.switch()
(四).gevent
遇到IO就切换 使用协程减少IO操作带来的时间消耗
greenlet 是gevent的底层
gevent是基于greenlet实现的
python代码在控制程序的切换
第一版:
import time
import gevent
from gevent import monkey
def eat():
print("吃")
gevent.sleep(2)
print("吃完了")
def play():
print("玩")
gevent.sleep(2)
print("玩美了") g1=gevent.spawn(eat)
g2=gevent.spawn(play)
g1.join() #等待g1结束
g2.join() #等待g2结束
第二版
要用gevent,需要将from gevent import monkey;monkey.patch_all()放到文件的开头
from gevent import monkey;monkey.patch_all()
import time
import gevent def eat(name):
print("吃")
time.sleep(2)
print("%s吃完了"%name) def play():
print("玩")
time.sleep(2)
print("玩美了") g1=gevent.spawn(eat,"alex") #括号里传参第一个是函数名,后面可以跟多个参数可以是位置参数,也可以是关键字参数,都是传给eat的
g2=gevent.spawn(play)
gevent.joinall([g1,g2])# g1.join()和g2.join()合并成一个.
print(g1.value) #None
四.协程起socket(tcp)
服务器代码
from gevent import monkey;monkey.patch_all()
import socket
import gevent
def talk(conn):
while True:
conn.send(b'hallo')
print(conn.recv(1024))
sk=socket.socket()
sk.bind(("127.0.0.1",9902))
sk.listen()
while True:
conn,addr=sk.accept()
gevent.spawn(talk,conn)
客户端代码
import socket
from threading import Thread
def client():
sk=socket.socket()
sk.connect(("127.0.0.1",9902))
while True:
print(sk.recv(1024))
sk.send(b'hi')
for i in range(5):
Thread(target=client).start()
python全栈开发 * 线程队列 线程池 协程 * 180731的更多相关文章
- python 全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python 理论知识,线程的创建)
昨日内容回顾 队列 队列 : 先进先出.数据进程安全 队列实现方式: 管道 + 锁 生产者消费者模型 : 解决数据供需不平衡 管道 双向通信 数据进程不安全 EOFError: 管道是由操作系统进行引 ...
- python全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python理论知识,线程的创建)
昨日内容回顾 队列 队列:先进先出.数据进程安全 队列实现方式:管道+锁 生产者消费者模型:解决数据供需不平衡 管道 双向通信,数据进程不安全 EOFError: 管道是由操作系统进行引用计数的 必须 ...
- Python全栈 项目(电子词典、协程、pdb调试)
后面我就不截图了 大家还是看原文吧 https://yq.aliyun.com/articles/629534 . ................. ...
- Python全栈【进程、线程】
Python全栈[进程.线程] 本节内容: 进程 线程 协程 I/O多路复用 进程 1.进程就是一个程序在一个数据集上的一次动态执行过程,进程是资源分配的最小单元. 2.进程一般由程序.数据集.进程控 ...
- python全栈开发目录
python全栈开发目录 Linux系列 python基础 前端~HTML~CSS~JavaScript~JQuery~Vue web框架们~Django~Flask~Tornado 数据库们~MyS ...
- Python全栈开发【模块】
Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...
- python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)
python全栈开发笔记第二模块 第四章 :常用模块(第二部分) 一.os 模块的 详解 1.os.getcwd() :得到当前工作目录,即当前python解释器所在目录路径 impor ...
- Python 全栈开发【第0篇】:目录
Python 全栈开发[第0篇]:目录 第一阶段:Python 开发入门 Python 全栈开发[第一篇]:计算机原理&Linux系统入门 Python 全栈开发[第二篇]:Python基 ...
- 学习笔记之Python全栈开发/人工智能公开课_腾讯课堂
Python全栈开发/人工智能公开课_腾讯课堂 https://ke.qq.com/course/190378 https://github.com/haoran119/ke.qq.com.pytho ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
随机推荐
- Notepad++崩溃后文件内容找不到问题
也许是因为Ctrl + s 摁太多太频繁,一不小心Notepad++崩溃了 重启后发现原来的文件还在,但是文件内容全部都被清空了 我没有手动备份这个文件, 如何找回??? 点击设置,首选项,里面有个备 ...
- Ubuntu 16.04 总出现红色圆圈警告和检测到系统程序出现问题
这种问题不可忽视!不可忽视!不可忽视!重要的事情说三遍!!!(一次死机,好多文件丢失,真是痛苦的经历) 自从从第三方安装了Python3.6,并将默认3.5改为3.6,导致ubuntu16.04右上角 ...
- 3D Slicer中文教程(三)—数据加载及保存方式
1.打开数据与保存数据 (1)打开数据 ——可以将数据拖拽到3D Slicer应用窗口或者从菜单栏工具栏打开. ——多种方式加载大量数据. 有关DICOM数据,请参阅DICOM模块文档. 对于几乎所有 ...
- 【转】QPainter中坐标系变换问题
转自:http://blog.sina.com.cn/s/blog_67cf08270100ww0p.html 一.坐标系简介. Qt中每一个窗口都有一个坐标系,默认的,窗口左上角为坐标原点,然后水平 ...
- Visual Studio Code 的使用方法和技巧
VSCode是微软推出的一款轻量编辑器,采取了和VS相同的UI界面,搭配合适的插件可以优化前端开发的体验. 布局:左侧是用于展示所要编辑的所有文件和文件夹的文件管理器,依次是`资源管理器`,`搜索`, ...
- 关于简单的安卓APP状态栏设置(类似沉浸式状态栏)
1.设置为全屏模式: 在所需设置为全屏模式的逻辑的onCreat()方法中加入以下代码即可: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.K ...
- 解决 Composer-Setup.exe 安装过程中的报错
问题 在 Windows 7 执行 Composer-Setup.exe 以安装 Composer 过程中 上图中点击[Next]时,出现如下报错信息 原因分析 由上述提示信息,可推测两方面原因: 1 ...
- JDK 11中的ZGC-一种可扩展的低延迟垃圾收集器
# 背景正如我们所知道的在JDK 11中即将迎来ZGC(The Z Garbage Collector),这是一个处于实验阶段的,可扩展的低延迟垃圾回收器.本文整合了外网几篇介绍ZGC的文章和代码. ...
- golang 如何将imagemagick 和golang 打包到docker 环境中
公司最近开发了个项目,用到了imagemagick 和golang 环境,在我本地机上开发妥妥的,结果准备部署到线上环境的时候,出现了大坑,尝试了无数次后,最后还是解决了,官方说有问题也不说清楚点,一 ...
- [转] vue之computed和watch
计算属性 computed 侦听器or观察者 watch 一直以来对computed和watch一知半解,用的时候就迷迷糊糊的,今天仔细看了看文档,突然茅塞顿开,原来就是这么简单啊: computed ...