一、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. Win7升Windows10有获取通知,但是就不推送的解决方法

    1. 删除“C:\Windows\SoftwareDistribution\Download”下所有文件2. 以管理员身份运行命令提示符,输入“wuauclt.exe /updatenow”并回车(注 ...

  2. Delphi 中的 XMLDocument 类详解(9) - 关于 HasChildNodes 与 IsTextElement

    unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...

  3. 绿色版mssql

    1.安装2008绿色版,缺少对应的企业管理器,安装官方版本的提示电脑没有重启(已经重启后) 2.选择一个可用版本的mssql,2000的可以用,MSSQL2000-HaoSQL,自带企业管理器和查询器

  4. unity 安装破解提示partern not found和tutorials学习

    1.破解安装问题:unity 安装破解提示partern not found 可能和安装了多个版本有关,删除了c下的unity目录也没有解决,试着重新安装也不能破解, 破解的软件的方式是生成lisen ...

  5. JMeter上架标的(yyb-csg)

    yyb-csg 1.登录时一直提示用户名不能为空,可是明明已经传值了呀 解决:添加cookie管理器 2.怎么获取到待受理的项目, 在python脚本的实现过程中发现,在平台受理一步中传的lid值就是 ...

  6. 记录一则xtts测试遇到的诡异现象

    背景:在一次xtts的测试中遇到因源库数据文件名称包含特殊字符导致表空间全量备份缺失文件,之所以说是诡异现象,是因为xtts的全备日志不报任何错误,在恢复阶段才发现缺少文件,这个缺陷比较隐晦,尤其在迁 ...

  7. Unity之显示fps功能

    如下: using UnityEngine; using System.Collections; public class ShowFpsOnGUI : MonoBehaviour { public ...

  8. Delphi7使用一段时间后抽风提示注册

    今天在单位用电脑接自己的移动硬盘,一打开资源管理器就卡死,删除硬盘总是提示用程序在使用,反复试了几次,老样子.很是窝火.干脆直接关机电脑,桌面上还有开着的Delphi编译器,重新开机!开机后一打开编译 ...

  9. Java代码走查具体考察点

    代码走查具体考察点 一.参数检验 公共方法都要做参数的校验,参数校验不通过,需要明确抛出异常或对应响应码. 在接口中也明确使用验证注解修饰参数和返回值,作为一种协议要求调用方按注解约束传参,返回值验证 ...

  10. python locust 性能测试:locust 关联---提取返回数据并使用

    from locust import HttpLocust, TaskSet, taskimport jsonfrom common import readConfig class UserBehav ...