并发编程---死锁||递归锁---信号量---Event事件---定时器
死锁
互斥锁:Lock(),互斥锁只能acquire一次
递归锁: RLock(),可以连续acquire多次,每acquire一次计数器+1,只有计数为0时,才能被抢到acquire
# 死锁
from threading import Thread,Lock
import time mutexA = Lock()
mutexB = Lock() class MyThread(Thread):
def run(self):
self.f1()
self.f2() def f1(self):
mutexA.acquire()
print('%s 拿到了A锁' %self.name) mutexB.acquire()
print('%s 拿到了B锁' % self.name)
mutexB.release()
mutexA.release() def f2(self):
mutexB.acquire()
print('%s 拿到了B锁' % self.name)
time.sleep(0.1) mutexA.acquire()
print('%s 拿到了A锁' % self.name)
mutexB.release()
mutexA.release() if __name__ == '__main__':
for i in range(10):
t=MyThread()
t.start()
'''
打印结果:
Thread-1 拿到了A锁
Thread-1 拿到了B锁
Thread-1 拿到了B锁
Thread-2 拿到了A锁
'''
死锁
#互斥锁只能acquire一次
from threading import Thread,Lock
mutexA = Lock()
mutexA.acquire()
mutexA.release() #递归锁:可以连续acquire多次,每acquier一次计数器就+1,只有计数为0时,才能被其他线程强到
from threading import Thread,RLock
import time mutexB = mutexA = RLock() class MyThread(Thread):
def run(self):
self.f1()
self.f2() def f1(self):
mutexA.acquire()
print('%s 拿到了A锁' %self.name) mutexB.acquire()
print('%s 拿到了B锁' % self.name)
mutexB.release()
mutexA.release() def f2(self):
mutexB.acquire()
print('%s 拿到了B锁' % self.name)
time.sleep(2) mutexA.acquire()
print('%s 拿到了A锁' % self.name)
mutexB.release()
mutexA.release() if __name__ == '__main__':
for i in range(10):
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-4 拿到了A锁
Thread-4 拿到了B锁
Thread-4 拿到了B锁
Thread-4 拿到了A锁
Thread-6 拿到了A锁
Thread-6 拿到了B锁
Thread-6 拿到了B锁
Thread-6 拿到了A锁
Thread-8 拿到了A锁
Thread-8 拿到了B锁
Thread-8 拿到了B锁
Thread-8 拿到了A锁
Thread-10 拿到了A锁
Thread-10 拿到了B锁
Thread-10 拿到了B锁
Thread-10 拿到了A锁
Thread-5 拿到了A锁
Thread-5 拿到了B锁
Thread-5 拿到了B锁
Thread-5 拿到了A锁
Thread-9 拿到了A锁
Thread-9 拿到了B锁
Thread-9 拿到了B锁
Thread-9 拿到了A锁
Thread-7 拿到了A锁
Thread-7 拿到了B锁
Thread-7 拿到了B锁
Thread-7 拿到了A锁
Thread-3 拿到了A锁
Thread-3 拿到了B锁
Thread-3 拿到了B锁
Thread-3 拿到了A锁
'''
递归锁
信号量
信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行
信号量同一时间可以有5个任务拿到锁去执行
信号量:同一时间有多个线程在进行
from threading import Thread,Semaphore,currentThread
import time,random sm=Semaphore(3) #厕所的坑 def task():
# sm.acquire()
# print('%s in' %currentThread.getName())
# sm.release()
with sm:
print('%s in' %currentThread().getName())
time.sleep(random.randint(2,3)) if __name__ == '__main__':
for i in range(10):
t=Thread(target=task)
t.start()
'''
打印结果:
Thread-1 in
Thread-2 in
Thread-3 in Thread-4 in Thread-5 in
Thread-6 in Thread-7 in Thread-9 in
Thread-8 in
Thread-10 in
'''
信号量
Event事件
event.isSet(): 返回event的状态值
event.wait():如果 event.isSet()==False将阻塞线程
event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态,等待操作系统调度
event.clear(): 恢复event的状态值为False
from threading import Thread,Event
import time event = Event()
# event.wait() 在原地等,指导执行到event.set()
# event.set() 等待结束 def student(name):
print('学生%s 正在听课' %name)
event.wait(2)
print('学生%s 课间活动' %name) def teacher(name):
print('老师%s 正在授课' %name)
time.sleep(5)
event.set() if __name__ == '__main__':
stu1 = Thread(target=student,args=('alex',))
stu2 = Thread(target=student,args=('yang',))
stu3 = Thread(target=student,args=('hang',))
tea1 = Thread(target=teacher,args=('ding',)) stu1.start()
stu2.start()
stu3.start()
tea1.start()
'''
打印结果:
学生alex 正在听课
学生yang 正在听课
学生hang 正在听课
老师ding 正在授课
学生hang 课间活动
学生yang 课间活动
学生alex 课间活动
''' #设置连接的超时时间
from threading import Thread,Event,currentThread
import time event = Event() def conn():
n=0
while not event.is_set():
if n == 3:
print('%s try too many' %currentThread().getName())
return
print('%s try %s' %(currentThread().getName(),n))
event.wait(0.5)
n+=1 print('%s is connecting' %currentThread().getName()) def check():
print('%s is checking' %currentThread().getName())
time.sleep(5)
event.set() if __name__ == '__main__':
for i in range(3):
t=Thread(target=conn)
t.start()
t=Thread(target=check)
t.start()
'''
打印结果:
Thread-1 try 0
Thread-2 try 0
Thread-3 try 0
Thread-4 is checking
Thread-1 try 1
Thread-3 try 1
Thread-2 try 1
Thread-1 try 2
Thread-3 try 2
Thread-2 try 2
Thread-1 try too many
Thread-3 try too many
Thread-2 try too many
'''
Event
定时器
定时器:隔一段时间,执行一个任务,每启动一个定时器,就等于启动一个线程
t=Timer(5,task,args=('egon',))
t.start()
t.cancel()
# from threading import Timer
#
# def task(name):
# print('hello %s' %name)
#
# t=Timer(5,task,args=('egon',))
# t.start() #验证码
from threading import Timer
import random class Code:
def __init__(self):
self.make_cache() def make_cache(self,interval=60):
self.cache = self.make_code()
print(self.cache)
self.t = Timer(interval,self.make_cache)
self.t.start() def make_code(self,n=4):
res=''
for i in range(n):
s1 = str(random.randint(0,9))
s2 = chr(random.randint(65,90))
res+=random.choice([s1,s2])
return res def check(self):
while True:
code = input('输入你的验证码>>: ').strip()
if code.upper() == self.cache:
print('验证码输入正确')
self.t.cancel()
break obj=Code()
obj.check() '''
打印结果:
X095
输入你的验证码>>: X095
验证码输入正确
'''
定时器
并发编程---死锁||递归锁---信号量---Event事件---定时器的更多相关文章
- python并发编程-多线程实现服务端并发-GIL全局解释器锁-验证python多线程是否有用-死锁-递归锁-信号量-Event事件-线程结合队列-03
目录 结合多线程实现服务端并发(不用socketserver模块) 服务端代码 客户端代码 CIL全局解释器锁****** 可能被问到的两个判断 与普通互斥锁的区别 验证python的多线程是否有用需 ...
- GIL全局解释器锁-死锁与递归锁-信号量-event事件
一.全局解释器锁GIL: 官方的解释:掌握概念为主 """ In CPython, the global interpreter lock, or GIL, is a m ...
- 8.14 day32 TCP服务端并发 GIL解释器锁 python多线程是否有用 死锁与递归锁 信号量event事件线程q
TCP服务端支持并发 解决方式:开多线程 服务端 基础版 import socket """ 服务端 1.要有固定的IP和PORT 2.24小时不间断提供服务 3.能够支 ...
- 递归锁,event事件和信号量
锁通常被用来实现对共享资源的同步访问.为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其它线程已经获得了该锁,则当前线程需等待其被释放),待资源访问 ...
- 死锁与递归锁 信号量 event 线程queue
1.死锁现象与递归锁 死锁:是指两个或两个以上的进程或线程在执行过程中,因争抢资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去,此时称系统处于死锁状态或系统产生了死锁,这些永远在互相 ...
- 线程 Thread类 GIL锁 信号量 Event事件
线程的开启方法 进程是操作系统调度的最小单位,一个进程最少有一个主线程,而一个进程中可以开启多个线程 from threading import Thread def task(): print('A ...
- 同步锁 死锁与递归锁 信号量 线程queue event事件
二个需要注意的点: 1 线程抢的是GIL锁,GIL锁相当于执行权限,拿到执行权限后才能拿到互斥锁Lock,其他线程也可以抢到GIL,但如果发现Lock任然没有被释放则阻塞,即便是拿到执行权限GIL也要 ...
- GIL 信号量 event事件 线程queue
GIL全局解释器锁 官方解释: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple n ...
- Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量
Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量 一丶线程的理论知识 什么是线程: 1.线程是一堆指令,是操作系统调度 ...
随机推荐
- [IR] What is XML
Concept: http://www.w3school.com.cn/xml/xml_cdata.asp Semistructured: 和普通纯文本相比,半结构化数据具有一定的结构性.OEM(Ob ...
- MQ选型对比
现公司选择RocketMQ作为消息队列服务器,用于异步处理,应用解耦,流量削锋和消息通讯四个场景.RocketMQ特性参见:Rocketmq整体分析. PS: http://blog.csdn.net ...
- Docker - Docker中搭建MySQL主从
1.pull完centos7纯净版的镜像后,创建容器,然后将宿主机上下载的MySQL文件 (MySQL下载地址:http://mysql.mirror.kangaroot.net/Downloads/ ...
- [转]ubuntu bits/predefs.h:没有那个文件或目录
[转]ubuntu bits/predefs.h:没有那个文件或目录 (2012-04-28 10:09:38) 转载▼ 标签: it 分类: Linux In file included from ...
- 【.NetCore学习】ubuntu16.04 搭建.net core mvc api 运行环境
查看linux内核版本 uname -a 打印结果 python@ubuntu:~$ uname -a Linux ubuntu 4.4.0-31-generic #50-Ubuntu SMP Wed ...
- Oracle数据库入门——sql语句和函数详解
一.oracle常用数据类型 一. 数据定义语言(ddl) 数据定义语言ddl(data definition language)用于改变数据库结构,包括创建.更改和删除数据库对象. 用于操纵表结构 ...
- 纯JS实现图片预览与等比例缩放和居中
最近做项目时有一个需求,广告位图片上传时要预览,并且要等比例缩放和居中.已经保存的广告位图片显示时也要等比例缩放和居中.我使用了下面的代码实现,不过可能有一些小问题. <!DOCTYPE HTM ...
- - Fractal(3.4.1)
C - Fractal(3.4.1) Time Limit:1000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64u Su ...
- nodejs----http系统模块使用和fs系统模块
----- const http=require("http"); const fs=require("fs"); var httpserver=http.cr ...
- [No0000119]什么是柳比歇夫的时间事件记录法
上图是我过去一年来做的时间事件记录中的某几天的记录文字.从接触到这种方法以来,也就是2009年的7月31日到今天,我已经作了一年多时间的记录.那么什么是时间事件记录?很简单,就像那两幅图片上所展示的, ...