昨日回顾

GIL全局解释器锁

  1. 本质上是互斥锁
  2. Cpython才有的
  3. 同一个进程下开启多个线程,让并发变成串行,保证线程安全

计算密集型和IO密集型

  1. 计算密集型

    使用多进程

  2. IO密集型

    使用多线程

死锁现象

两个锁在两个或多个线程或进程中被相互调用,从而陷入相互等待的现象

递归锁

解决死锁问题,相当于串在一起的锁,只有在递归锁的引用计数为0 ,才能被使用

信号量

相当于锁店,设置多少个就能被多少个线程或进程使用

线程队列

FOFI队列

先进先出

LIFO队列

后进先出

优先级队列

按照从左到右,根据数字/acsii大小,越小,优先级越高

今日内容

Event事件

控制线程的执行,由一些线程去控制另一些线程

当Event对象为False时,该线程会被阻塞,直至Event对象为真,相当于红绿灯的作用

isSet():返回Event对象的状态
wait():判断Event对象的状态,若为Flase,则阻塞
Set():设置Event对象为Ture
clear():恢复Event对象为False
from threading import Event
from threading import Thread
import time

e = Event()

def light():
    print('红灯亮')
    time.sleep(5)
    print('绿灯亮')
    e.set()

def car():
    print('等红灯中...')
    e.wait()
    print('车辆加速中')

t = Thread(target=light)
t.start()

for i in range(20):
    a  = Thread(target=car)
    a.start()

线程池与进程池

  1. 进程池和线程池是用来控制当前程序允许创建的进程或线程的数量
  2. 保证在硬件允许的范围内创建进程/线程的数量

异步提交和回调函数

可以为进程池或线程池内的每个进程或线程绑定一个函数,该函数在进程或线程的任务执行完毕后自动触发,并接收任务的返回值当作参数,该函数称为回调函数

ProcessPoolExecutor(5)  # 5代表只能开启5个进程
ProcessPoolExecutor()  # 默认以CPU的个数限制进程数
ThreadPoolExecutor()  # 默认以CPU个数 * 5 限制线程数

pool.shutdown()  # 会让所有线程池的任务结束后,才往下执行代码
pool.submit('传函数地址')  # 异步提交任务
pool.submit('传函数地址').add_done_callback('回调函数地址')  # 回调函数
import time
# from concurrent.futures import ProcessPoolExecutor
from concurrent.futures import ThreadPoolExecutor
pool = ThreadPoolExecutor(5)

def task(res):
    print('线程任务开始')
    time.sleep(1)
    print('线程任务结束')
    return res

def call_back(res):
    res1 = res.result()
    print(res1)

for i in range(5):
    pool.submit(task,i).add_done_callback(call_back)

协程

  • 协程:在单线程下实现并发,不是操作系统资源

  • 通过手动模拟遇到IO切换,欺骗操作系统误以为没有进程IO操作,从而实现在程序层面的并发( 切换+保存状态)

  • 优点:IO密集型情况下,会提高效率
  • 缺点:若在计算密集型的情况下,来回切换,反而效率更低

yiled

无法检测IO,无法实现遇到IO自动切换

# 串行执行
import time

def func1():
    for i in range(10000000):
        i+1

def func2():
    for i in range(10000000):
        i+1

start = time.time()
func1()
func2()
stop = time.time()
print(stop - start)  # 0.8930509090423584
# 验证计算密集型的情况下效率更低: # 1.4250171184539795
# 基于yield并发执行
import time
def func1():
    while True:
        10000000+1
        yield

def func2():
    # g生成器对象
    g = func1()
    for i in range(10000000):
        time.sleep(100)  # 模拟IO,yield并不会捕捉到并自动切换
        i+1
        next(g)

start = time.time()
func2()
stop = time.time()
print(stop-start)

gevent模块

第三方模块,可以监听IO操作,并实现切换 + 保存状态

from gevent import spawn,joinall  # 用于做切换 + 保存状态
from gevent import monkey  # 可以监听该程序下所有的IO操作
monkey.patch_all()
import time

def func1():
    print('1')
    time.sleep(1)

def func2():
    print('2')
    time.sleep(2)

def func3():
    print('3')
    time.sleep(3)

start = time.time()

s1=spawn(func1)
s2=spawn(func2)
s3=spawn(func3)

# 必须传序列类型
joinall((s1,s2,s3))

end = time.time()
print(end - start)

(day31) Event+协程+进程/线程池的更多相关文章

  1. 并发编程中死锁、递归锁、进程/线程池、协程TCP服务器并发等知识点

    1.死锁 定义; 类似两个人分别被囚禁在两间房子里,A手上拿着的是B囚禁房间的钥匙,而B拿着A的钥匙,两个人都没法出去,没法给对方开锁,进而造成死锁现象.具体例子代码如下: # -*-coding:u ...

  2. 并发编程(六)--进程/线程池、协程、gevent第三方库

    一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上百个或上千个,手动创建就较为繁琐,这时就可 ...

  3. 并发编程(六)——进程/线程池、协程、gevent第三方库

    进程/线程池.协程.gevent第三方库 一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上 ...

  4. day37协程与线程套接字通讯

    协程与线程套接字通讯基于多线程实现套接字服务端支持并发,服务端 from socket import * from threading import Thread def comunicate(con ...

  5. unity3D中协程和线程混合

    这是我google unity3D一个问题偶然发现的在stackflow上非常有趣的帖子: 大意是 要在unity3D上从server下载一个zip,并解压到持久化地址.并将其载入到内存中.以下展示了 ...

  6. Python学习---线程/协程/进程学习 1220【all】

    Python学习---线程基础学习 Python学习---线程锁/信号量/条件变量同步1221 Python学习---同步条件event/队列queue1223 Python学习---进程 1225 ...

  7. I/O多路复用、协程、线程、进程

    select注册fd,阻塞,当有fd状态改变时返回,确认对应的fd,做下一步处理.简单来说就是先注册,注册完后休眠并设置一个定时器醒来查看,有事件就通知来取,进行后续动作,没事件就继续睡,再设闹钟.用 ...

  8. 多任务-python实现-进程,协程,线程总结(2.1.16)

    @ 目录 1.类比 2.总结 关于作者 1.类比 一个生产玩具的工厂: 一个生产线成为一个进程,一个生产线有多个工人,所以工人为线程 单进程-多线程:一条生产线,多个工人 多进程-多线程:多条生产线, ...

  9. 用Swoole4 打造高并发的PHP协程Mysql连接池

    码云代码仓库:https://gitee.com/tanjiajun/MysqlPool 代码仓库:https://github.com/asbectJ/swoole4.git 前言 在写这篇文章之前 ...

随机推荐

  1. 如何看破真假美猴王 ? --java中的Shadowing和Obscuring

    故事背景 <西游记>第五十七回:唐僧因悟空又打死拦路强盗,再次把他撵走.六耳猕猴精趁机变作悟空模样,抢走行李关文,又把小妖变作唐僧.八戒.沙僧模样,欲上西天骗取真经.真假二悟空从天上杀到地 ...

  2. Spring Data JPA 梳理 - JPA是什么

    总结: JPA是java的标准,不是Spring的标准 java标准中一般通过Meta-INF文件规范开发层面的事情,JPA也不例外,使用persistence.xml JPA定义了Entity 到 ...

  3. Highly Efficient Analysis of Glycoprotein Sialylation in Human Serum by Simultaneous Quantification of Glycosites and Site-Specific Glycoforms (通过同时定量糖基化位点和位点特异性糖型来高效分析人血清中的糖蛋白唾液酸化)-阅读人:陈秋实

    期刊名:Journal of Proteome Research 发表时间:(2019年9月) IF:3.78 单位: 中国科学院大连化学物理研究所 中国科学院大学 大连医科大学第二附属医院 物种:人 ...

  4. .Net Core 微服务容器系列基础目录篇

    1.开场白 HI,各位老铁,大家端午好,之前写了些关于.net core商城系列的文章,有点乱,今天心血来潮想着整理一下(今天只是先把目录列出来,后面的每篇文章这两天会进行重新修改的,目前先将就看下) ...

  5. 你应该知道的简单易用的CSS技巧

    作为前端,在工作中难免会遇到关于排版的问题,以下是我整理的一些关于CSS的技巧,希望对你能有帮助. 1.每个单词的首字母大写 一般我们会用JS实现,其实CSS就可以实现. JS代码: var str ...

  6. Thinkphp5.0第五篇

    原样输出 使用literal标签防止模板标签被解析 例如 {literal} {$name}<br/> {/literal} 模板单行注释 {//注释内容} 多行注释 {/*注释内容*/} ...

  7. JVM(四)类加载机制

    1.静态绑定和动态绑定 静态绑定:即前期绑定,在程序执行前方法已经被绑定,此时由编译器或者其他连接程序实现,针对Java,可以理解为编译期的绑定,java中只有final.static.private ...

  8. Cocos Creator一步一步实现重力球游戏

    『 游戏玩法 』 通过手机陀螺仪,调整手机,让球从上一层的间隔中落到下一层,楼层会不断上涨,如果球碰到上方或者下方的火焰,游戏结束. 『 游戏预览 』 ​ 『 开发工具 』 1. CocosCreat ...

  9. FreeRTOS优化与错误排查方法

    写在前面 主要是为刚接触 FreeRTOS 的用户指出那些新手通常容易遇到的问题.这里把最主要的篇幅放在栈溢出以及栈溢出j检测上,因为栈相关的问题是初学者遇到最多的问题. printf-stdarg. ...

  10. Hyper-V虚拟机win7网络红叉,无法上网解决方法

    之前一直都是玩Vmware虚拟机,后来win8之后的系统有Hyper-V虚拟机就开始接触了. Windows 中内置的Hyper-V管理器可以说是给很多人带来了惊喜!至少运行的流畅程度要比Vmware ...