一、互斥锁:
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的多线程锁跟队列的更多相关文章

  1. Python进阶【第二篇】多线程、消息队列queue

    1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...

  2. python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)

    python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...

  3. python多线程编程(6): 队列同步

    原文请看:http://www.cnblogs.com/holbrook/archive/2012/03/15/2398060.html 前面介绍了互斥锁和条件变量解决线程间的同步问题,并使用条件变量 ...

  4. [ Python - 11 ] 多线程及GIL全局锁

    1. GIL是什么? 首先需要明确的一点是GIL并不是python的特性, 它是在实现python解析器(Cpython)时所引入的一个概念. 而Cpython是大部分环境下默认的python执行环境 ...

  5. Python多线程锁

    [Python之旅]第六篇(四):Python多线程锁   python lock 多线程 多线程使用方法 多线程锁 摘要:   在多线程程序执行过程中,为什么需要给一些线程加锁以及如何加锁,下面就来 ...

  6. python GIL 全局锁,多核cpu下的多线程性能究竟如何?

    python GIL 全局锁,多核cpu下的多线程性能究竟如何?GIL全称Global Interpreter Lock GIL是什么? 首先需要明确的一点是GIL并不是Python的特性,它是在实现 ...

  7. 扯扯python的多线程的同步锁 Lock RLock Semaphore Event Condition

    我想大家都知道python的gil限制,记得刚玩python那会,知道了有pypy和Cpython这样的解释器,当时听说是很猛,也就意味肯定是突破了gil的限制,最后经过多方面测试才知道,还是那德行… ...

  8. python并发编程-进程间通信-Queue队列使用-生产者消费者模型-线程理论-创建及对象属性方法-线程互斥锁-守护线程-02

    目录 进程补充 进程通信前言 Queue队列的基本使用 通过Queue队列实现进程间通信(IPC机制) 生产者消费者模型 以做包子买包子为例实现当包子卖完了停止消费行为 线程 什么是线程 为什么要有线 ...

  9. Python并发编程03 /僵孤进程,孤儿进程、进程互斥锁,进程队列、进程之间的通信

    Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 目录 Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 1. 僵尸进程/孤儿进 ...

随机推荐

  1. OpenRASP管理后台安装记录

    OpenRASP项目地址https://rasp.baidu.com/ 一.安装java 在CentOS中安装ElasticSearch需要Java1.8.0,可执行命令java -version查看 ...

  2. VScode像Codeblocks一样,不启动调试和Debug直接运行

    要是配置C++ 编译环境,这边走 用了VScode童鞋,都知道,写C++是不保留窗口的,除非打上断点或者: system("pause"); 这里给大家分享一种不需要,F5或者Ct ...

  3. 一个简单的wed服务器SHTTPD(7)———— SHTTPD内容类型的实现

    //start from the very beginning,and to create greatness //@author: Chuangwei Lin //@E-mail:979951191 ...

  4. MySQL导出数据到文件中的方法

    MySQL导出数据到文件中的方法 1.导出数据到txt文件中实例:把数据表studscoreinfo中所有数据导出到指定的位置方法:select * from 表名 into outfile 指定导出 ...

  5. 扩欧(exgcd讲解)

    注意本文的证明都来源于这位大大大大大大大牛 知识点.扩展欧几里得求逆元 看完下面的证明后建议联系一下这题同余方程 可以对exgcd的用途和写法有有初步了解. \(问题描述:对于三个自然数 a,b,c ...

  6. 【基础】excel如何根据数据内容显示不同颜色。

    需求: 店柜完成率排名相比上阶段升降,升显示绿色“↑“,降显示红色“↓”,持平显示黑色“-”. 步骤: 第一步 先计算两次排名的差值(本次排名-上次排名). 第二步 对差值列设置单元格格式,设置格式如 ...

  7. 【FreeRTOS学习04】小白都能懂的 Queue Management 消息队列使用详解

    消息队列作为任务间同步扮演着必不可少的角色: 相关文章 [FreeRTOS实战汇总]小白博主的RTOS学习实战快速进阶之路(持续更新) 文章目录 相关文章 1 前言 2 xQUEUE 3 相关概念 3 ...

  8. Kali:系统安装之后进行所需配置

    apt设置源 由于官网的源需要墙或者想使用国内的源,可以修改source.list vi /etc/source.list 打开文件并修改为其他可用的源地址,以下可供参考 deb http://ftp ...

  9. CSS实现div填充剩余高度

    相信小伙伴们经常会遇到这个问题,我也是填了很多坑,查了很多资料,才解决的,下面我列出2个方法: 我们的需求如图: 1:(这个方法不推荐使用,因为可能会因为设备不同,而出现未知BUG,特别是div出现p ...

  10. Unity接入友盟分享遇到的坑

    最近项目接了一下友盟分享的SDK,中间遇到了几个坑,写下几条注意事项记录一下. 接入之前需要准备友盟开发者账号,相应平台开发者账号(微信.QQ.新浪微博)等... 安卓端: 1.确保 AndroidM ...