python多线程网络编程_python之网络编程-多线程
死锁现象,递归锁
所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因为争夺资源而造成的一种互相等待的现象,若无外力作用,他们将无法推进下去,此时称系统处于死锁状态或系统产生了死锁,这些永远在相互等待的进程称为死锁进程。
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之网络编程-多线程相关推荐
- python高级网络编程_Python高级网络编程系列之基础篇
一.Socket简介 1.不同电脑上的进程如何通信? 进程间通信的首要问题是如何找到目标进程,也就是操作系统是如何唯一标识一个进程的! 在一台电脑上是只通过进程号PID,但在网络中是行不通的,因为每台 ...
- python 图形化socket编程_Python黑帽编程2.8 套接字编程
Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...
- python读取手机文件_python 读取 网络 文件
Python之pandas数据加载.存储 Python之pandas数据加载.存储 0. 输入与输出大致可分为三类: 0.1 读取文本文件和其他更好效的磁盘存储格式 2.2 使用数据库中的数据 0.3 ...
- python面向对象的编程_python面向对象的编程
创建类和对象 面向对象编程是一种编程方式,此编程方式的落地需要使用 "类" 和 "对象" 来实现,所以,面向对象编程其实就是对 "类" 和 ...
- python 多线程 廖雪峰_Python 一篇学会多线程
多线程和多进程是什么自行google补脑,廖雪峰官网也有,但是不够简洁,有点晕,所以就整个简单的范例. 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用 ...
- python的异步网络编程_python异步网络编程怎么使socket关闭之后立即执行一段代码?...
import socket from _socket import getdefaulttimeout class MySocket(socket.socket): """ ...
- python 协程库_python --- 协程编程(第三方库gevent的使用)
1. 什么是协程? 协程(coroutine),又称微线程.协程不是线程也不是进程,它的上下文关系切换不是由CPU控制,一个协程由当前任务切换到其他任务由当前任务来控制.一个线程可以包含多个协程,对于 ...
- python测试网络连通性_Python测试网络连通性示例【基于ping】
本文实例讲述了Python测试网络连通性.,具体如下: Python代码 #!/usr/bin/python # -*- coding:GBK -*- """Docume ...
- python小老鼠编程_Python小老鼠编程,Python入门到精通(非常详细)
公司介绍 苏州鼎锐软件科技有限公司成立于2011年,地处中国新加坡合作苏州工业园区的国际科技园,是一家专业从事技术和人才外包的软件服务公司.自成立以来,公司始终站在技术市场的最前端,与国外大型企业合作 ...
最新文章
- 戴上脑机接口头盔,他用大脑跟别人「说话」
- python 获取10位和13位 时间戳
- POJ2195费用流+BFS建图
- 从未这么明白的设计模式(一):单例模式
- 删库不跑路,MySQL 数据库恢复教程
- java 跟踪错误程序_Java异常处理 如何跟踪异常的传播路径
- MySQL SELECT..INTO OUTFILE语句只能导出1000行的故障
- QUIC DataChannels的第一步
- 利用Helm简化Kubernetes应用部署(2)
- 基于Tablestore多元索引打造亿量级店铺搜索系统
- 世界首富比尔盖茨花钱全过程!
- python设置字符编码_python字符编码问题一则
- Pannellum:详解利用Pannellum实现Web三维全景功能
- OAM 与 KubeVela 项目整体捐赠进入 CNCF,让云端应用交付更加简单
- 如何在photoshop中应用3DLUT预设?ps怎么安装.3dl、.look、.cube预设?
- JS判断当前浏览器是否为IE内核
- 如何使用计算机中的导出,微信里的文件导入电脑(如何用数据线导出微信文件)...
- c语言快排过程,快速排序(快排)C语言实现
- html中将scss转编译为css,SASS把scss转化为css的四种转化方式与命令
- 达布中值定理(导数中间值定理)