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. 僵尸进程/孤儿进 ...
随机推荐
- spring security learning(spring in action)
1.使用Spring Security配置命名空间 spring securtiy 提供了安全性相关的命名空间,我们可以将spring security的命名空间声明添加到spring公用的配置xml ...
- 基于TCP的客户端和服务器端的代码设计
实验平台 linux 实验内容 编写TCP服务器和客户端程序,程序运行时服务器等待客户端连接.一旦连接成功,服务器显示客户端的IP地址和端口号,并向客户端发送字符串 实验原理 TCP是面向连接的通信, ...
- python(If 判断)
一.if判断 如果 条件满足,才能做某件事情, 如果 条件不满足,就做另外一件事情,或者什么也不做 注意: 代码的缩进为一个 tab 键,或者 4 个空格 在 Python 开发中,Tab 和空格不要 ...
- springboot后端校验
这一篇讲解了如何定义特殊的校验 https://www.cnblogs.com/cjsblog/p/8946768.html https://blog.csdn.net/xgblog/article/ ...
- C. Anton and Fairy Tale(数学推式子)
\(数学题,式子并不难推,但边界是真的烦\) \(\color{Red}{Ⅰ.其实可以发现,当m>=n时,每次都可以粮食补到n,所以一定是在第n天消耗完毕}\) \(\color{Purple} ...
- HTTP GET | POST | DELETE请求
依赖: <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp& ...
- 王颖奇 20171010129《面向对象程序设计(java)》第十二周学习总结
实验十二 图形程序设计 理论: 10.1 AWT与Swing简介 10.2 框架的创建10.3 图形程序设计10.4 显示图像 (具体学习总结在最后) 实验: 实验时间 2018-11-14 1.实 ...
- ActiveMQ 事务、集群、持久订阅者、ActiveMQ监控
JMS介绍 JMS是什么? JMS的全称Java Message Service,既Java消息服务. JMS是SUN提供的旨在统一各种MOM(Message-Oriented Middleware) ...
- What?废柴, 模拟登陆,代码控制滑动验证真的很难吗?Are you kidding???
1.简介 在前边的python接口自动化的时候,我们由于博客园的登录机制的改变,没有用博客园的登录测试接口.那么博客园现在变成了滑动验证登录,而且现在绝大多数的登录都变成这种滑动验证和验证码的登录验证 ...
- WriteUp_easy_sql_堆叠注入_强网杯2019
题目描述 随便注 解题过程 查看源码,发现应该不适合sqlmap自动化注入,该题应该是让你手工注入: <!-- sqlmap是没有灵魂的 --> <form method=" ...