Python的多线程锁跟队列
一、互斥锁:
1.线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁。
2.互斥锁为资源引入一个状态:锁定、非锁定
3.某个线程要更改共享数据是,先将其锁定。此时资源的状态为锁定,其他线程不能更改知道该
线程释放资源,将资源的状态编程"非锁定",其他的线程才能再次锁定该资源
4.互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。
例子:
创建锁
suo = threading.LOck()
锁定
suo.acquire()
非锁定释放
suo.release()
例子:
import threading
count = 0
def line1():
"""
函数1
:return:
"""
global count
global lock
for i in range(100000):
lock.acquire()
count += 1
lock.release()
def line2():
"""
函数2
:return:
"""
global count
global lock
for i in range(100000):
lock.acquire()
count += 1
lock.release()
lock = threading.Lock() # 创建锁
thread1 = threading.Thread(target=line1) # 创建线程
thread2 = threading.Thread(target=line1) # 创建线程
thread1.start() # 线程开始
thread2.start() # 线程开始
thread1.join() # 阻塞线程
thread2.join() # 阻塞线程
print(count)
二、死锁
在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会
造成死锁‘尽管死锁很少发生,但一旦发生就会造成应用的停止响应。
三、GIL 全局解释器锁:、
因为全局解释器锁的原因,保证了python在运行的时候一次只能运行一个线程,而做不到线程
的并行,一个线程执行完了才能接着执行下一线程。(线程只能并发不能并行)
我们可以使用多进程来实现程序的并行。
问题一: python单线程和多线程分别来完成工作,到底那个快?
1.io密集型:涉及到网络、磁盘io的任务都是io密集型任务,这类任务的特点是cpu消耗很少,任务的大部分的
时间都在等待io操作完成(因为io的速度远远低于cpu和内训的速度)
结论:io密集型操作,多线程比单线程要快
2.cpu密集型:cpu密集型也称为计算密集型,任务的特点是要进行大量的计算,消耗cpu资源,比如
计算圆周率、对视频进行高清解码等等,全靠cpu的运算能力
结论:cpu密集型操作,单线程比多线程要快
四、队列
1.Python的Queue模块中提供了同步的、线程安全的队列,这些队列都实现了锁原语,能够在多线程中直接
使用。可以使用队列来实现线程间的同步。
2.初始化Queue()对象时,若括号中没有指定最大可接收的消息数量,或数量为负值,那么就代表可
接受的消息数量没有上限。
队列的方法:
task_done() 在队列中每获取一个数据,就要发送一个标记
join() 判断队列中的任务是否执行完毕,如果没有执行完毕,会一直等待。
qsize() 返回当前队列包含的消息数量;
empty() 判断队列是否为空 ,返回True 或 False
full() 判断队列是否为满了 ,返回True 或 False
put() 添加队列,如果队列数据达到上限,就不能再添加。
get() 获取队列,如果队列数据为空,就不能在获取
put_nowait() 添加队列不等待
get_nowait() 获取队列不等待
1.FIFO(先入先出)队列
from queue import Queue
2.LIFO后入先出
from queue import LifoQueue
3.优先级队列 PriorityQueue
from queue import PriorityQueue
优先级队列,以优先级顺序(最低优先级)检索打开条目的队列的变体。
条目通常是表单的元组:(优先number, data)
注意:这三个模块都有上面九个方法
Python的多线程锁跟队列的更多相关文章
- Python进阶【第二篇】多线程、消息队列queue
1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...
- python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)
python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...
- python多线程编程(6): 队列同步
原文请看:http://www.cnblogs.com/holbrook/archive/2012/03/15/2398060.html 前面介绍了互斥锁和条件变量解决线程间的同步问题,并使用条件变量 ...
- [ Python - 11 ] 多线程及GIL全局锁
1. GIL是什么? 首先需要明确的一点是GIL并不是python的特性, 它是在实现python解析器(Cpython)时所引入的一个概念. 而Cpython是大部分环境下默认的python执行环境 ...
- Python多线程锁
[Python之旅]第六篇(四):Python多线程锁 python lock 多线程 多线程使用方法 多线程锁 摘要: 在多线程程序执行过程中,为什么需要给一些线程加锁以及如何加锁,下面就来 ...
- python GIL 全局锁,多核cpu下的多线程性能究竟如何?
python GIL 全局锁,多核cpu下的多线程性能究竟如何?GIL全称Global Interpreter Lock GIL是什么? 首先需要明确的一点是GIL并不是Python的特性,它是在实现 ...
- 扯扯python的多线程的同步锁 Lock RLock Semaphore Event Condition
我想大家都知道python的gil限制,记得刚玩python那会,知道了有pypy和Cpython这样的解释器,当时听说是很猛,也就意味肯定是突破了gil的限制,最后经过多方面测试才知道,还是那德行… ...
- python并发编程-进程间通信-Queue队列使用-生产者消费者模型-线程理论-创建及对象属性方法-线程互斥锁-守护线程-02
目录 进程补充 进程通信前言 Queue队列的基本使用 通过Queue队列实现进程间通信(IPC机制) 生产者消费者模型 以做包子买包子为例实现当包子卖完了停止消费行为 线程 什么是线程 为什么要有线 ...
- Python并发编程03 /僵孤进程,孤儿进程、进程互斥锁,进程队列、进程之间的通信
Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 目录 Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 1. 僵尸进程/孤儿进 ...
随机推荐
- codeforce 227D Naughty Stone Piles (贪心+递归+递推)
Description There are n piles of stones of sizes a1, a2, -, an lying on the table in front of you. D ...
- MySQL 子查询——查询最大值
子查询指将一个查询语句嵌套在另一个查询语句中.子查询可以在 SELECT.UPDATE 和 DELETE 语句中使用,而且可以进行多层嵌套.在实际开发时,子查询经常出现在 WHERE 子句中.子查询在 ...
- vue js手机端滑到某一个位置时固定位置显示
1.HTML <div id="searchBar"><ul class="items_filter" :class="search ...
- 【Kafka】Producer API
Producer API Kafka官网文档给了基本格式 地址:http://kafka.apachecn.org/10/javadoc/index.html?org/apache/kafka/cli ...
- 【Hadoop离线基础总结】Hue与Impala集成
Hue与Impala集成 1.修改hue.ini配置文件 [impala] server_host=node03 server_port=21050 impala_conf_dir=/etc/impa ...
- pyltp安装教程及简单使用
1.pyltp简介 pyltp 是哈工大自然语言工作组推出的一款基于Python 封装的自然语言处理工具(轮子),提供了分词,词性标注,命名实体识别,依存句法分析,语义角色标注的功能. 2.pyltp ...
- 选择函数index_select
书中(pytorch入门实战)讲:index_select(input, dim, index),指定维度dim上选取,未有示例. 查到相关资料后, import torch as t # 导入tor ...
- 微信浏览器中禁止下拉出现网页由xxx.xxxxx.com提供,QQ浏览器X5内核提供技术支持这个
直接上代码 window.onload = function(){ document.body.addEventListener('touchmove', function (e) { e.preve ...
- 6、保持会话(save)
前言 为什么要保存会话呢?举个很简单的场景,你在上海测试某个功能接口的时候,发现了一个BUG,而开发这个接口的开发人员是北京的一家合作公司.你这时候给对方开发提bug, 如何显得专业一点,能让对方心服 ...
- JVM系列(2)-GC
1.什么是GC? 大白话说就是垃圾回收机制,内存空间是有限的,你创建的每个对象和变量都会占据内存,gc做的就是对象清除将内存释放出来,这就是GC要做的事. 2.需要GC的区域 说起垃圾回收的场所,了解 ...