1 GIL:全局解释器锁    GIL本质就是一把互斥锁,是夹在解释器身上的,    同一个进程内的所有线程都需要先抢到GIL锁,才能执行解释器代码

2、GIL的优缺点:    优点:        保证Cpython解释器内存管理的线程安全

    缺点:        同一进程内所有的线程同一时刻只能有一个执行,        也就说Cpython解释器的多线程无法实现并行

from threading import Thread,current_thread
import timedef task():print('%s is running' %current_thread().name)time.sleep(3)print('%s is done' %current_thread().name)if __name__ == '__main__':t1=Thread(target=task)t2=Thread(target=task)t3=Thread(target=task)t1.start()t2.start()t3.start()

验证

一、 计算密集型应该使用多进程:

#frommultiprocessingimportProcess#fromthreadingimportThread##importtime##importos##print(os.cpu_count())##deftask1():#res=0#foriinrange(1,100000000):#res+=i##deftask2():#res=0#foriinrange(1,100000000):#res+=i##deftask3():#res=0#foriinrange(1,100000000):#res+=i##deftask4():#res=0#foriinrange(1,100000000):#res+=i##if__name__=='__main__':##p1=Process(target=task1)##p2=Process(target=task2)##p3=Process(target=task3)##p4=Process(target=task4)##p1=Thread(target=task1)#p2=Thread(target=task2)#p3=Thread(target=task3)#p4=Thread(target=task4)#start_time=time.time()#p1.start()#p2.start()#p3.start()#p4.start()#p1.join()#p2.join()#p3.join()#p4.join()#stop_time=time.time()#print(stop_time-start_time)

多进程

二、IO密集型应该使用多线程:

from multiprocessing import Process
from threading import Threadimport timedef task1():time.sleep(3)def task2():time.sleep(3)def task3():time.sleep(3)def task4():time.sleep(3)if __name__ == '__main__':# p1=Process(target=task1)# p2=Process(target=task2)# p3=Process(target=task3)# p4=Process(target=task4)# p1=Thread(target=task1)# p2=Thread(target=task2)# p3=Thread(target=task3)# p4=Thread(target=task4)# start_time=time.time()# p1.start()# p2.start()# p3.start()# p4.start()# p1.join()# p2.join()# p3.join()# p4.join()# stop_time=time.time()# print(stop_time - start_time) #3.138049364089966
p_l=[]start_time=time.time()for i in range(500):p=Thread(target=task1)p_l.append(p)p.start()for p in p_l:p.join()print(time.time() - start_time)

多线程

进程池与线程池:

为什么要用“池”?

  池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务

  池子内什么时候装进程:并发的任务属于计算密集型

  池子内什么时候装线程:并发的任务属于IO密集型

# from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
# import time,os,random
#
# def task(x):
#     print('%s 接客' %os.getpid())
#     time.sleep(random.randint(2,5))
#     return x**2
#
# if __name__ == '__main__':
#     p=ProcessPoolExecutor() # 默认开启的进程数是cpu的核数
#
#     # alex,武佩奇,杨里,吴晨芋,张三
#
#     for i in range(20):
#         p.submit(task,i)from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import time,os,randomdef task(x):print('%s 接客' %x)time.sleep(random.randint(2,5))return x**2if __name__ == '__main__':p=ThreadPoolExecutor(4) # 默认开启的线程数是cpu的核数*5# alex,武佩奇,杨里,吴晨芋,张三for i in range(20):p.submit(task,i)

代码演示

阻塞与非阻塞、同步与异步:

1、阻塞与非阻塞指的是程序的两种运行状态

  阻塞:遇到IO就发生阻塞,程序一旦遇到阻塞操作就会停在原地,并且立刻释放CPU资源

  非阻塞(就绪态或运行态):没有遇到IO操作,或者通过某种手段让程序即便是遇到IO操作也不会停在原地,执行其他操作,力求尽可能多的占有CPU

2、同步与异步指的是提交任务的两种方式:

  同步调用:提交完任务后,就在原地等待,直到任务运行完毕后,拿到任务的返回值,才继续执行下一行代码

  异步调用:提交完任务后,不在原地等待,直接执行下一行代码,结果?

from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import time,os,randomdef task(x):print('%s 接客' %x)time.sleep(random.randint(1,3))return x**2if __name__ == '__main__':# 异步调用# p=ThreadPoolExecutor(4) # 默认开启的线程数是cpu的核数*5#
    # # alex,武佩奇,杨里,吴晨芋,张三#
    # obj_l=[]# for i in range(10):#     obj=p.submit(task,i)#     obj_l.append(obj)#
    # # p.close()# # p.join()# p.shutdown(wait=True)#
    # print(obj_l[3].result())# print('主')

异步调用

    # 同步调用p=ThreadPoolExecutor(4) # 默认开启的线程数是cpu的核数*5# alex,武佩奇,杨里,吴晨芋,张三for i in range(10):res=p.submit(task,i).result()print('主')

同步调用

转载于:https://www.cnblogs.com/TF511/p/9954193.html

GIL、进/线程池、同/异步、阻/非阻塞相关推荐

  1. JAVA那点破事!并发、IO模型、集合、线程池、死锁、非阻塞、AQS....

    关于Java面试,面试官一般喜欢问哪些问题? 本文对一些高频问题做了汇总,为了便于大家查找问题,了解全貌,整理个目录,我们可以快速全局了解关于 JAVA 接下来,我们逐条来看看每个问题及答案 JDK. ...

  2. JAVA那点破事,并发、IO模型、集合、线程池、死锁、非阻塞、AQS...

    JDK.JRE.JVM 三者有什么关系? 答案: JDK(全称 Java Development Kit),Java开发工具包,能独立创建.编译.运行程序. JDK = JRE + java开发工具( ...

  3. 并发编程之进程池,线程池 和 异步回调,协程

    1.进程池和线程池 2.异步回调 3.协程 4.基于TCP使用多线程实现高并发 一.进程池和线程池 什么是进程池和线程池: ''' 池 Pool 指的是一个容器 线程池就是用来存储线程对象的 容器创建 ...

  4. servlet的异步和非阻塞原理

    之前研究了下servlet的异步和非阻塞原理,看到一篇文章,下面有两个问题,顺便解答了下 servlet3异步原理与实践 Danniel 3楼 2019.05.18 21:31 请问,AsyncLon ...

  5. GIL , 线程池 , 同步 , 异步 , 队列 , 事件

    一.什么是GIL 官方解释: ''' In CPython, the global interpreter lock, or GIL, is a mutex that prevents multipl ...

  6. python 进程池、线程池 与异步调用、回调机制

    进程池.线程池使用案例 from concurrent.futures import ProcessPoolExecutor # 进程池模块 from concurrent.futures impor ...

  7. kafaka使用 消息队列_Java使用消息队列还是直接使用线程池ExecutorService异步处理?...

    MQ可以更加有扩展性, 支持的场景更多, 而且支持消息自动的持久化, 建议你看看 RabbitMQ 和 AMQP 协议, JMS 可以学但是没 AMQP 更加通用, redis的MQ还是不要用了, 那 ...

  8. SpringBoot - 使用ExecutorService线程池执行异步任务教程(以Runnable任务为例)

    有时我们的系统需要进行一些比较耗时的操作,比如用户注册后要调用邮件服务器给用户发送个邮件,又比如上传一个大数据量的 excel 并导入到数据库.如果后端的这些工作比较耗时,那么前台的页面便会一直处于等 ...

  9. cxf打印报文日志_使用线程池实现异步打日志和存库的任务调度

    最近项目中有一个需求,在每一个接口的入口处都要打日志,并且打出来的日志是要xml格式的报文.刚接到这个需求的时候,也没多想,就直接使用spring的aop实现了这个需求,但在后面的性能测试中,却遇到了 ...

最新文章

  1. 钉钉 6.0 盯上应用开发
  2. 打包文档_苏教版小学数学16年级全十二册教案Word文档打包下载
  3. MySQL count函数的具体介绍
  4. PhantomJS宣布终止开发
  5. oracle检查外键依赖,Oracle中检查外键是否有索引的SQL脚本分享
  6. 分享到facebook没有封面图_拾柒自制书封面图分享~
  7. java调python报错Cannot create PyString with non-byte value
  8. 以下()不是python的数值运算操作符_python运算符与数据类型
  9. SIP应答代码【ZT】
  10. 分析varnish日志
  11. 在C#中利用Keep-Alive处理Socket网络异常断开的方法 (转)
  12. 感知器分类模型回顾与python实现
  13. php正则去掉空格,PHP怎么实现正则去掉空格
  14. 数据库系统概论总结(第五版)
  15. Nifi 数据流整合工具
  16. Nginx系列:windows10系统下安装nginx的安装并配置!
  17. 某同学使用计算机求,【判断题】某同学计算机考试成绩80分,这是统计指标值...
  18. 批量爬起百度图片上的数据代码--python
  19. [嵌入式框架][nrf51822][SDK12.3] BLE分层设计 DFU OTA 透传(NUS) 电量 设备信息 BLE_HID
  20. TOP10 区块链游戏关注榜

热门文章

  1. 学Python的初体验——模块简述
  2. 一篇文章教会你使用Python中三种简单的函
  3. 目标检测的二十年发展史—从传统方法到深度学
  4. 重磅!GitHub发布年度机器学习榜:TensorFlow最火,PyTorch消失!
  5. 手把手教我班小姐姐学java之多态
  6. 写给小白的机器学习之数据表示与特征工程详解(附实战代码)
  7. Python 下划线
  8. java md5 16位解密_Java实现MD5(32/16位)大小写加密
  9. php和c语言那个竞争大,【后端开发】php和c语言哪个难
  10. python三种数据类型_Python零基础入门学习02:Python基本数据类型:数字类型