一、Gil锁(Global Interpreter Lock)

python全局解释器锁,有了这个锁的存在,python解释器在同一时间内只能让一个进程中的一个线程去执行,这样python的多线程就无法利用多核优势,但是这并不是python语言本身的缺点,是解释器的缺点,这个问题只存在于Cpython解释其中,像Jpython就没有。但是Cpthon是python官方解释器(算目前运行效率最高的吧),所以多数人都以为Gil锁是python语言的弊端。

#GIL锁图解

过程解释:

1、加载python解释器代码

2、加载自己的py文件

3、py文件作为参数传给解释器(因为有GIL锁,一次只能一个线程进入)

4、解释器将py文件编译成.pyc字节码文件

5、解释器通过虚拟机将字节码文件转为二进制文件

6、二进制文件等待cpu调用

二、线程队列

import queue

线程队列有三种形式

1、先进先出

q = queue.Queue(3)    创建一个长度为3的队列,先进先出

q.put()

q.get()

q.size()    #当前队列中有多少个元素

2、后进先出

q = queue.LifoQueue(3)     创建一个长度为3的后进先出队列

3、优先级队列

q = queue.PriorityQueue(3)    创建一个长度为3的优先级队列

 import queue
# q = queue.Queue()
# q =queue.LifoQueue()
q = queue.PriorityQueue() #优先级队列
# put里是一个元组,元组的一个元素代表优先级(通常是数字,也可以是非数字,数字越小,优先级越高),第二个元素是存入队列中的值
#一个队列中,优先级必须是同一种数据类型,才能比较,否则会报错
# 如果优先级相同,那么按照后面值的ASCII码的顺序来排序
#优先级相同的数据,他们后面的值必须是相同的数据类型才能比较,但优先级相同的两个字典无法比较 # q.put((-1,'ca')) #优先级相同的两个字符串,逐个比较ASCII码值
# q.put((-1,'cb')) # q.put(("a","d")) #优先级为非数值类型
# q.put(('b',"c")) # q.put((1,{1:'hh',2:'ss'})) #优先级相同的两个字典,无法比较,报错
# q.put((1,{3:'dd',4:'jj'})) q.put((2,(4,5))) #优先级相同的元组,逐个比较元组元素值
q.put((2,(4,4))) print(q.get())
print(q.get())

优先级队列详解

三、concurrent.futures模块

通过这个模块可以创建和使用线程池和进程池

格式

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor

t = ThreadPoolExecutor(max_workers=4)     #创建一个线程池对象,容量为4

方法:

t.submit(fun,*args,*kwargs)              #异步提交任务

res= t.submit(fun,*args,*kwargs)     #返回值是一个对象

res.result()           #从对象中取值,会等待任务的执行结果,等不到是阻塞

t.shutdown)         #等待已提交任务完成,相当于close()和join()的效果

t.map(fun, iter)                #异步提交任务

res = t.map(fun, iter)      #返回结果是一个生成器对象

for el  in  res:              #取值

  print(el)

add_done_callback(fun2)        #添加回调函数

t.submit(fun1,参数).add_don_callback(fun2)     #调用回调函数语法

day34 GIL锁 线程队列 线程池的更多相关文章

  1. python并发编程之线程剩余内容(线程队列,线程池)及协程

    1. 线程的其他方法 import threading import time from threading import Thread,current_thread def f1(n): time. ...

  2. day33 GIL锁 线程队列 线程池

    1.    全局解释器锁GIL Python代码的执行由Python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行.虽然 Python 解释器中可 ...

  3. Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet

    主要内容: 线程的一些其他方法 线程事件 线程队列 线程池 GIL锁 协程 Greenlet Gevent 一. 线程(threading)的一些其他方法 from threading import ...

  4. GIL锁和进程/线程池

    GIL锁 1.GIL锁 全局解释器锁,就是一个把互斥锁,将并发变成串行,同一时刻只能有一个线程使用共享资源,牺牲效率,保证数据安全,也让程序员避免自己一个个加锁,减轻开发负担 带来的问题 感觉单核处理 ...

  5. python全栈开发 * 线程队列 线程池 协程 * 180731

    一.线程队列 队列:1.Queue 先进先出 自带锁 数据安全 from queue import Queue from multiprocessing import Queue (IPC队列)2.L ...

  6. day 34 线程队列 线程池 协程 Greenlet \Gevent 模块

    1 线程的其他方法 threading.current_thread().getName()    查询当前线程对象的名字 threading.current_thread().ident      ...

  7. day35:线程队列&进程池和线程池&回调函数&协程

    目录 1.线程队列 2.进程池和线程池 3.回调函数 4.协程:线程的具体实现 5.利用协程爬取数据 线程队列 1.线程队列的基本方法 put 存 get 取 put_nowait 存,超出了队列长度 ...

  8. Day9 进程同步锁 进程队列 进程池 生产消费模型 进程池 paramike模块

    进程同步锁: 当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢? 其实也就是相当于让进程独享资源. fro ...

  9. GIL全局解释器锁、死锁、递归锁、线程队列

    目录 GIL全局解释锁 多线程的作用 测试计算密集型 IO密集型 死锁现象 递归锁 信号量(了解) 线程队列 GIL全局解释锁 GIL本质上是一个互斥锁. GIL是为了阻止同一个进程内多个进程同时执行 ...

随机推荐

  1. com.mysql.jdbc.Driver 与 org.gjt.mm.mysql.Driver的区别

    com.mysql.jdbc.Driver的前身是org.gjt.mm.mysql.Driver,现在主要用com.mysql.jdbc.Driver,但为了保持兼容性保留了org.gjt.mm.my ...

  2. Spring Data JPA框架

    1.前言 扔一个 spring data jpa 的代码,可运行,后续补充博客内容. 环境:eclipse + tomcat8 2.部分截图 3.源码 https://gitee.com/niceyo ...

  3. python框架之Django(6)-查询优化之select_related&prefetch_related

    准备 定义如下模型 from django.db import models # 省份 class Province(models.Model): name = models.CharField(ma ...

  4. php判断是否为命令行模式

    function is_cli(){ : ; }

  5. Tensorflow之调试(Debug)及打印变量

    参考资料:https://wookayin.github.io/tensorflow-talk-debugging 几种常用方法: 1.通过Session.run()获取变量的值 2.利用Tensor ...

  6. IT人员如何开好站立会议

    一.来由 软件开发的过程却又是一个离不开协作.沟通的过程.一个缺乏良好协作,沟通.理解和目标一致的软件团队,是很难高质高效的交付的. 敏捷的众多实践中,有一个为了提升团队协作的经典实践:站立会议 二. ...

  7. scrum学习笔记

    http://www.scrumcn.com/agile/scrum-knowledge-library/scrum.html#tab-id-1 推荐电子书 <Scrum精髓_敏捷转型指南> ...

  8. 玩转spring boot——结合docker

    前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 liunx机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有 ...

  9. week_one-python格式化输出

    1.多行格式化输出 (1) # Author:larlly name = input("input your name :") age = input("input yo ...

  10. Node + Redis 实现分布式Session方案(转载)

    Session是什么? Session 是面向连接的状态信息,是对 Http 无状态协议的补充. Session 怎么工作? Session 数据保留在服务端,而为了标识具体 Session 信息指向 ...