死锁现象,递归锁

所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因为争夺资源而造成的一种互相等待的现象,若无外力作用,他们将无法推进下去,此时称系统处于死锁状态或系统产生了死锁,这些永远在相互等待的进程称为死锁进程。

from threading import Thread

from threading import Lock

import time

lock_A = Lock()

lock_B = Lock()

class MyThread(Thread):

def run(self):

self.f1()

self.f2()

def f1(self):

lock_A.acquire()

print(f'{self.name}拿到了锁A')

lock_B.acquire()

print(f'{self.name}拿到了锁B')

lock_B.release()

lock_A.release()

def f2(self):

lock_B.acquire()

print(f'{self.name}拿到了锁B')

time.sleep(1)

lock_A.acquire()

print(f'{self.name}拿到了锁A')

lock_A.release()

lock_B.release()

if __name__ == '__main__':

for i in range(1,4):

t = MyThread()

t.start()

# Thread-1拿到了锁A

# Thread-1拿到了锁B

# Thread-1拿到了锁B

# Thread-2拿到了锁A

# 锁死了....

遇到死锁现象可通过 递归锁解决。

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

这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。上面的例子如果使用RLock代替Lock,则不会发生死锁:

from threading import Thread

from threading import RLock

import time

lock_A = RLock()

class MyThread(Thread):

def run(self):

self.f1()

self.f2()

def f1(self):

lock_A.acquire()

print(f'{self.name}拿到了锁A')

lock_A.acquire()

print(f'{self.name}拿到了锁B')

lock_A.release()

lock_A.release()

def f2(self):

lock_A.acquire()

print(f'{self.name}拿到了锁B')

time.sleep(1)

lock_A.acquire()

print(f'{self.name}拿到了锁A')

lock_A.release()

lock_A.release()

if __name__ == '__main__':

for i in range(1,4):

t = MyThread()

t.start()

# Thread-1拿到了锁A

# Thread-1拿到了锁B

# Thread-1拿到了锁B

# Thread-1拿到了锁A

# Thread-2拿到了锁A

# Thread-2拿到了锁B

# Thread-2拿到了锁B

# Thread-2拿到了锁A

# Thread-3拿到了锁A

# Thread-3拿到了锁B

# Thread-3拿到了锁B

# Thread-3拿到了锁A

'''

递归锁是一把锁,锁上有记录,只要acquire一次,锁上就计数1次, acquire2次,锁上就计数2次,

release1次,减一,

只要递归锁计数不为0,其他线程不能抢.

'''

python多线程网络编程_python之网络编程-多线程相关推荐

  1. python高级网络编程_Python高级网络编程系列之基础篇

    一.Socket简介 1.不同电脑上的进程如何通信? 进程间通信的首要问题是如何找到目标进程,也就是操作系统是如何唯一标识一个进程的! 在一台电脑上是只通过进程号PID,但在网络中是行不通的,因为每台 ...

  2. python 图形化socket编程_Python黑帽编程2.8 套接字编程

    Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...

  3. python读取手机文件_python 读取 网络 文件

    Python之pandas数据加载.存储 Python之pandas数据加载.存储 0. 输入与输出大致可分为三类: 0.1 读取文本文件和其他更好效的磁盘存储格式 2.2 使用数据库中的数据 0.3 ...

  4. python面向对象的编程_python面向对象的编程

    创建类和对象 面向对象编程是一种编程方式,此编程方式的落地需要使用 "类" 和 "对象" 来实现,所以,面向对象编程其实就是对 "类" 和 ...

  5. python 多线程 廖雪峰_Python 一篇学会多线程

    多线程和多进程是什么自行google补脑,廖雪峰官网也有,但是不够简洁,有点晕,所以就整个简单的范例. 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用 ...

  6. python的异步网络编程_python异步网络编程怎么使socket关闭之后立即执行一段代码?...

    import socket from _socket import getdefaulttimeout class MySocket(socket.socket): """ ...

  7. python 协程库_python --- 协程编程(第三方库gevent的使用)

    1. 什么是协程? 协程(coroutine),又称微线程.协程不是线程也不是进程,它的上下文关系切换不是由CPU控制,一个协程由当前任务切换到其他任务由当前任务来控制.一个线程可以包含多个协程,对于 ...

  8. python测试网络连通性_Python测试网络连通性示例【基于ping】

    本文实例讲述了Python测试网络连通性.,具体如下: Python代码 #!/usr/bin/python # -*- coding:GBK -*- """Docume ...

  9. python小老鼠编程_Python小老鼠编程,Python入门到精通(非常详细)

    公司介绍 苏州鼎锐软件科技有限公司成立于2011年,地处中国新加坡合作苏州工业园区的国际科技园,是一家专业从事技术和人才外包的软件服务公司.自成立以来,公司始终站在技术市场的最前端,与国外大型企业合作 ...

最新文章

  1. 戴上脑机接口头盔,他用大脑跟别人「说话」
  2. python 获取10位和13位 时间戳
  3. POJ2195费用流+BFS建图
  4. 从未这么明白的设计模式(一):单例模式
  5. 删库不跑路,MySQL 数据库恢复教程
  6. java 跟踪错误程序_Java异常处理 如何跟踪异常的传播路径
  7. MySQL SELECT..INTO OUTFILE语句只能导出1000行的故障
  8. QUIC DataChannels的第一步
  9. 利用Helm简化Kubernetes应用部署(2)
  10. 基于Tablestore多元索引打造亿量级店铺搜索系统
  11. 世界首富比尔盖茨花钱全过程!
  12. python设置字符编码_python字符编码问题一则
  13. Pannellum:详解利用Pannellum实现Web三维全景功能
  14. OAM 与 KubeVela 项目整体捐赠进入 CNCF,让云端应用交付更加简单
  15. 如何在photoshop中应用3DLUT预设?ps怎么安装.3dl、.look、.cube预设?
  16. JS判断当前浏览器是否为IE内核
  17. 如何使用计算机中的导出,微信里的文件导入电脑(如何用数据线导出微信文件)...
  18. c语言快排过程,快速排序(快排)C语言实现
  19. html中将scss转编译为css,SASS把scss转化为css的四种转化方式与命令
  20. 达布中值定理(导数中间值定理)

热门文章

  1. 1.9 通过反射获取注解信息
  2. ACM入门之【最短路】
  3. 力扣: 268. 丢失的数字
  4. 推荐一套开源通用后台管理系统(附源码)
  5. 十个经典Java 集合面试题!
  6. mybatis教程--原始方式和mapper方式开发dao详解
  7. javascript高精度计算解决方案
  8. 【JavaSE_06】Java中的数组(array)
  9. 【JavaSE03】Java中分支语句-概念
  10. 【JavaSE02】Java基本语法-思维导图