一.线程队列

队列:
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的更多相关文章

  1. python 全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python 理论知识,线程的创建)

    昨日内容回顾 队列 队列 : 先进先出.数据进程安全 队列实现方式: 管道 + 锁 生产者消费者模型 : 解决数据供需不平衡 管道 双向通信 数据进程不安全 EOFError: 管道是由操作系统进行引 ...

  2. python全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python理论知识,线程的创建)

    昨日内容回顾 队列 队列:先进先出.数据进程安全 队列实现方式:管道+锁 生产者消费者模型:解决数据供需不平衡 管道 双向通信,数据进程不安全 EOFError: 管道是由操作系统进行引用计数的 必须 ...

  3. Python全栈 项目(电子词典、协程、pdb调试)

    后面我就不截图了 大家还是看原文吧                          https://yq.aliyun.com/articles/629534 . ................. ...

  4. Python全栈【进程、线程】

    Python全栈[进程.线程] 本节内容: 进程 线程 协程 I/O多路复用 进程 1.进程就是一个程序在一个数据集上的一次动态执行过程,进程是资源分配的最小单元. 2.进程一般由程序.数据集.进程控 ...

  5. python全栈开发目录

    python全栈开发目录 Linux系列 python基础 前端~HTML~CSS~JavaScript~JQuery~Vue web框架们~Django~Flask~Tornado 数据库们~MyS ...

  6. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

  7. python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)

    python全栈开发笔记第二模块 第四章 :常用模块(第二部分)     一.os 模块的 详解 1.os.getcwd()    :得到当前工作目录,即当前python解释器所在目录路径 impor ...

  8. Python 全栈开发【第0篇】:目录

    Python 全栈开发[第0篇]:目录   第一阶段:Python 开发入门 Python 全栈开发[第一篇]:计算机原理&Linux系统入门 Python 全栈开发[第二篇]:Python基 ...

  9. 学习笔记之Python全栈开发/人工智能公开课_腾讯课堂

    Python全栈开发/人工智能公开课_腾讯课堂 https://ke.qq.com/course/190378 https://github.com/haoran119/ke.qq.com.pytho ...

  10. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

随机推荐

  1. [物理学与PDEs]第1章习题13 静磁场的矢势在媒质交界面上的条件

    试讨论对静磁场的矢势, 如何决定其在媒质交界面上的条件. 解答: 由 $\rot{\bf A}={\bf B}$ 知 $$\bex \oint_l {\bf A}\cdot\rd {\bf l} =\ ...

  2. [物理学与PDEs]第1章习题3 常场强下电势的定解问题

    在一场强为 ${\bf E}_0$ (${\bf E}_0$ 为常向量) 的电场中, 置入一个半径为 $R$ 的导电球体, 试导出球外电势所满足的方程及相应的定解条件. 解答: 设导电球体为 $B_R ...

  3. axios发送post请求,如何提交表单数据?

    axios发送post请求,提交表单数据的方式 默认情况下,axios将JavaScript对象序列化为JSON.要以application / x-www-form-urlencoded格式发送数据 ...

  4. Linux文件权限命令及配置

    http://www.cnblogs.com/CgenJ/archive/2011/07/28/2119454.html

  5. SpringBoot配置

    多模块Maven项目 .gitignore文件 .idea *.iml targetout log tmp test 父模块pom文件 <?xml version="1.0" ...

  6. 如何给PDF文档添加和删除贝茨编号

    PDF文件的使用频率高了,我们也不只局限于使用PDF文件了,也会需要编辑PDF文件的时候,那么如何在PDF文件中添加和去除贝茨编号呢,应该有很多小伙伴都想知道吧,今天就来跟大家分享一下吧,小伙伴们就一 ...

  7. centos/linux/ubuntu在局域网上网

    前言:对于服务器来说,一般不会安装windowns系统,都是会安装类unix系统,在局域网或者在内网中,上网还是走代理上网 1.知道代理服务器的ip及端口 2.就两条命令 export  http_p ...

  8. Eclipse Oxygen.2 Release (4.7.2)添加JUnit

    在project节点上右击,Build Path->Add Libraries->JUnit

  9. Java Spring Boot VS .NetCore (十一)自定义标签 Java Tag Freemarker VS .NetCore Tag TagHelper

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  10. RxJS操作符(二)

    一.Observable的性质 三种状态:nex, error, complete 进入到Error状态: ) .filter(val=>{ throw '出错了' }) .take() .re ...