死锁现象

所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁

from threading import Thread,Lock

import time

mutexA = Lock()

mutexB = Lock()

class MyThread(Thread):

def run(self):

self.task1()

self.task2()

def task1(self):

mutexA.acquire()

print('%s task1 get A' %self.name)

mutexB.acquire()

print('%s task1 get B' % self.name)

mutexB.release()

mutexA.release()

def task2(self):

mutexB.acquire()

print('%s task2 get B' % self.name)

time.sleep(1) # Thread-2 拿到执行权,执行get A出现死锁,此时thread2需要B锁,而thread1占用,与此同时,thread1需要A锁,thread2占用

mutexA.acquire()

print('%s task2 get A' % self.name)

mutexA.release()

mutexB.release()

if __name__ == '__main__':

for i in range(10):

t = MyThread()

t.start()

-------------------输出

Thread-1 task1 get A

Thread-1 task1 get B

Thread-1 task2 get B

Thread-2 task1 get A # 出现死锁,整个程序被阻塞

递归锁

解决方法,递归锁,在Python中为了支持在同一线程中多次请求同一资源,python提供了可重入锁RLock。

这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。

直到一个线程所有的acquire都被release,其他的线程才能获得资源。上面的例子如果使用RLock代替Lock,则不会发生死锁,二者的区别是:递归锁可以连续acquire多次,而互斥锁只能acquire一次

from threading import Thread,RLock

import time

mutexA = mutexB = RLock()

class MyThread(Thread):

def run(self):

self.task1()

self.task2()

def task1(self):

mutexA.acquire()

print('%s task1 get A' %self.name)

mutexB.acquire()

print('%s task1 get B' % self.name)

mutexB.release()

mutexA.release()

time.sleep(1) # Thread-2 拿到执行权,,此时counter=0,thread2执行task1

def task2(self):

mutexB.acquire()

print('%s task2 get B' % self.name)

mutexA.acquire()

print('%s task2 get A' % self.name)

mutexA.release()

mutexB.release()

if __name__ == '__main__':

for i in range(10):

t = MyThread()

t.start()

------------------------输出

Thread-1 task1 get A

Thread-1 task1 get B

Thread-2 task1 get A

Thread-2 task1 get B

Thread-3 task1 get A

Thread-3 task1 get B

Thread-4 task1 get A

Thread-4 task1 get B

Thread-5 task1 get A

Thread-5 task1 get B

Thread-6 task1 get A

Thread-6 task1 get B

Thread-7 task1 get A

Thread-7 task1 get B

Thread-8 task1 get A

Thread-8 task1 get B

Thread-9 task1 get A

Thread-9 task1 get B

Thread-10 task1 get A

Thread-10 task1 get B

Thread-1 task2 get B

Thread-1 task2 get A

Thread-2 task2 get B

Thread-2 task2 get A

Thread-4 task2 get B

Thread-4 task2 get A

Thread-3 task2 get B

Thread-3 task2 get A

Thread-5 task2 get B

Thread-5 task2 get A

Thread-6 task2 get B

Thread-6 task2 get A

……

python 线程死锁_python线程死锁与递归锁相关推荐

  1. python线程进程_python 线程进程

    四 线程死锁和递归锁 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁,因为系统判断这部分资源都正在使用,所有这两个线程在无外力作用下将一直等待下去.下面 ...

  2. python中线程同步_Python线程同步在实际应用中功能体现

    在Python编程语言中,对于线程的操作是一个比较重要的应用技术.我们将会在这篇文章中为大家详细介绍一下这方面的相关基础内容,Python线程同步的应用方式.多个执行线程经常要共享数据,如果仅仅读取共 ...

  3. python 线程池_python线程池

    线程池概念 什么是线程池? 诸如web服务器.数据库服务器.文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务. 构建服务器应用程序的一个过于简单的模型是:每当一个请求到 ...

  4. python 判断线程状态_Python线程指南

    Python线程指南 本文介绍了Python对于线程的支持,包括"学会"多线程编程需要掌握的基础以及Python两个线程标准库的完整介绍及使用示例. 注意:本文基于Python2. ...

  5. python线程状态_Python线程

    1. 线程基础 1.1. 线程状态 线程有5种状态,状态转换的过程如下图所示: 1.2. 线程同步(锁) 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样).但是当线程需要共享数据时,可能存在 ...

  6. python结束线程类_Python线程指南(转)

    1. 线程基础 1.1. 线程状态 线程有5种状态,状态转换的过程如下图所示: 1.2. 线程同步(锁) 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样).但是当线程需要共享数据时,可能存在 ...

  7. python 线程池_Python线程池及其原理和使用(超级详细)

    系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 线程池在系统启动时即 ...

  8. python线程创建对象_Python线程下thread对象的用法介绍(附实例)

    本篇文章给大家带来的内容是关于Python线程下thread对象的用法介绍(附实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. Thread对象 Thread类用于表示单独的控制 ...

  9. python 线程同步_Python 线程同步

    zhoushixiong Python 线程同步 以下代码可以直观展示加锁和不加锁时,对数据修改情况. 加锁时 # -*-* encoding:UTF-8 -*- # author : shoushi ...

最新文章

  1. largest number java_将给定的数组组成最大的数 Largest Number
  2. 微信8.0大更新,6大新功能加入!未来还将引入自己的输入法!
  3. 比特币交易平台 php,比特币PHP离线交易开发包
  4. spring mvc 接收List数组类型参数
  5. spark之4:基础指南(源自官方文档)
  6. 第六章 Qt布局管理器Layout
  7. 用什么代码可以改变键盘_为什么我改变了对代码质量的看法
  8. CSS 中 的 margin、border、padding 区别 (内边距、外边距)
  9. 【文末有福利】卷积学习与图像识别的技术发展
  10. 在机器学习中,ground truth是什么意思?
  11. json解析 spark_PySpark算子处理空间数据全解析(8):构造空间数据的RDD(2)
  12. uml c语言函数流程图,UML流程图模板分享
  13. 十沣科技自主研发仿真软件 有效实现飞机起落噪声精细仿真
  14. 分享一款超强看图软件。极速看图。这些看图软件比系统自带的强大多了!
  15. 微信小程序在线考试系统 刷题考试小程序毕业设计 毕业论文 开题报告和效果图参考
  16. 习惯养成app_如何培养优秀的开发人员沟通技巧,养成不良习惯
  17. .csv是什么文件格式,什么软件可以打开?xls与csv文件是什么区别?功能和作用上有什么不同?
  18. 我的2015—跌宕与破晓
  19. Outlook.com的imap和pop服务器
  20. Mac OSX 安装qemu

热门文章

  1. ArrayList和LinkedList的索引问题
  2. 005_Spring的属性注入
  3. java jackson json_使用Java和Jackson将Json序列化为通用结构而无...
  4. Xml转换成view的原理
  5. 第四章 SQL*plus介绍、常用命令
  6. CAD2015软件安装资料及教程
  7. office2013软件安装资料及教程
  8. win10计算机恢复出厂设置,Windows 10 一键恢复出厂设置详细教程
  9. C语言开发windows桌面程序,开发 windows 桌面软件,现在主流用什么技术?
  10. mysql port range_Defining port and port-range in /etc/services file