死锁

互斥锁: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事件---定时器的更多相关文章

  1. python并发编程-多线程实现服务端并发-GIL全局解释器锁-验证python多线程是否有用-死锁-递归锁-信号量-Event事件-线程结合队列-03

    目录 结合多线程实现服务端并发(不用socketserver模块) 服务端代码 客户端代码 CIL全局解释器锁****** 可能被问到的两个判断 与普通互斥锁的区别 验证python的多线程是否有用需 ...

  2. GIL全局解释器锁-死锁与递归锁-信号量-event事件

    一.全局解释器锁GIL: 官方的解释:掌握概念为主 """ In CPython, the global interpreter lock, or GIL, is a m ...

  3. 8.14 day32 TCP服务端并发 GIL解释器锁 python多线程是否有用 死锁与递归锁 信号量event事件线程q

    TCP服务端支持并发 解决方式:开多线程 服务端 基础版 import socket """ 服务端 1.要有固定的IP和PORT 2.24小时不间断提供服务 3.能够支 ...

  4. 递归锁,event事件和信号量

    锁通常被用来实现对共享资源的同步访问.为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其它线程已经获得了该锁,则当前线程需等待其被释放),待资源访问 ...

  5. 死锁与递归锁 信号量 event 线程queue

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

  6. 线程 Thread类 GIL锁 信号量 Event事件

    线程的开启方法 进程是操作系统调度的最小单位,一个进程最少有一个主线程,而一个进程中可以开启多个线程 from threading import Thread def task(): print('A ...

  7. 同步锁 死锁与递归锁 信号量 线程queue event事件

    二个需要注意的点: 1 线程抢的是GIL锁,GIL锁相当于执行权限,拿到执行权限后才能拿到互斥锁Lock,其他线程也可以抢到GIL,但如果发现Lock任然没有被释放则阻塞,即便是拿到执行权限GIL也要 ...

  8. GIL 信号量 event事件 线程queue

    GIL全局解释器锁 官方解释: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple n ...

  9. Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量

    Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量 一丶线程的理论知识 什么是线程:    1.线程是一堆指令,是操作系统调度 ...

随机推荐

  1. [Object Tracking] Overview of algorithms for Object Tracking

    From: https://www.zhihu.com/question/26493945 可以载入史册的知乎贴 目标跟踪之NIUBILITY的相关滤波 - 专注于分享目标跟踪中非常高效快速的相关滤波 ...

  2. Linux下跑程序,防止命令终端(断网,断电)

    有时候我们在服务器上跑程序,会发现当我们离开窗口时,正在执行的程序中断了,这让人非常郁闷.下面介绍防止程序中断的方法: 新建一个名为yourname的Screen窗口: screen -S yourn ...

  3. 【Docker】容器操作(转)

    来自:https://www.cnblogs.com/zydev/p/5803461.html 列出主机上的容器 列出正在运行的容器:   docker ps 列出所有容器:  docker ps - ...

  4. OpenGL——圆公式相关变化的绘制

    #include<iostream> #include <math.h> //旧版本 固定管线 #include<Windows.h> #include <G ...

  5. AndroidのInputFillter之按字符过滤长度,一个中文当两个字符

    /** * 以Byte数的方式来实现的LengthFilter * @author bvin */ public class OneByteInputFilter implements InputFi ...

  6. JMS规范概览

    JMS(java message service)常用的消息模式有两种:点对点(PTP)和订阅发布(Pub/Sub) Clients A 和 B是消息生产者,以两种不同的目的地向Clients C, ...

  7. scala breeze使用替换底层线性库

    scala -J-Dcom.github.fommil.netlib.NativeSystemBLAS.natives=mkl_rt.dll -cp "D:\betn\Scala\Scala ...

  8. 网络通信协议之ICMP

    ICMP(互联网控制消息协议) ICMP >>Internet Control Message Protocol IP协议的缺点: >>无差错报告和差错纠正机制 >> ...

  9. windous----快捷键

    桌面操作: • 贴靠窗口:Win +左/右> Win +上/下>窗口可以变为1/4大小放置在屏幕4个角落• 切换窗口:Alt + Tab(不是新的,但任务切换界面改进)• 任务视图:Win ...

  10. http://202.194.116.8/webapps/portal/frameset.jsp?tab_id=_2_1&url=%2fwebapps%2fblackboard%2fexecute%2

    http://202.194.116.8/webapps/portal/frameset.jsp?tab_id=_2_1&url=%2fwebapps%2fblackboard%2fexecu ...