并发编程---死锁||递归锁---信号量---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
验证码输入正确
‘‘‘

定时器

原文地址:https://www.cnblogs.com/Mryang123/p/8910367.html

时间: 2024-10-08 10:34:37

并发编程---死锁||递归锁---信号量---Event事件---定时器的相关文章

Python并发编程05/ 死锁/递归锁/信号量/GIL锁/进程池/线程池

目录 Python并发编程05/ 死锁/递归锁/信号量/GIL锁/进程池/线程池 1.昨日回顾 2.死锁现象与递归锁 2.1死锁现象 2.2递归锁 3.信号量 4.GIL全局解释器锁 4.1背景 4.2为什么加锁 5.GIL与Lock锁的区别 6.验证计算密集型IO密集型的效率 6.1 IO密集型 6.2 计算密集型 7.多线程实现socket通信 7.1服务端 7.2客户端 8.进程池,线程池 Python并发编程05/ 死锁/递归锁/信号量/GIL锁/进程池/线程池 1.昨日回顾 #生产者消

并发&并行 同步&异步 GIL 任务 同步锁 死锁 递归锁

# 并发&并行 同步&异步 GIL 任务 同步锁 死锁 递归锁 # 并发:是指系统具有处理多个任务(动作)的能力 # 并行:是指系统具有 同时 处理多个任务(动作)的能力 # 同步:当进程执行到一个IO(等待外部数据)的时候,需要等待外部数据接收完 # 异步:当进程执行到一个IO(等待外部数据)的时候,不需要等待外部数据接收完,还可以做其它的处理 # GIL: 全局解释器锁 在python中,无论你启多少个线程,你有多少个cpu,python在执行的时候在同一时刻只请允许一个线程运行 #

Java并发编程:Concurrent锁机制解析

.title { text-align: center } .todo { font-family: monospace; color: red } .done { color: green } .tag { background-color: #eee; font-family: monospace; padding: 2px; font-size: 80%; font-weight: normal } .timestamp { color: #bebebe } .timestamp-kwd

python开发线程:死锁和递归锁&信号量&定时器&线程queue&事件evevt

一 死锁现象与递归锁 进程也有死锁与递归锁,在进程那里忘记说了,放到这里一切说了额 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁 from threading import Thread,Lock import time mutexA=Lock() mutexB=Lock() class MyThread(Thread):

Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型

一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例子 #并发运行,效率高,但竞争同一打印终端,带来了打印错乱 from multiprocessing import Process import os,time def work(): print('%s is running' %os.getpid()) time.sleep(2) print('

并发编程8 线程的创建&验证线程之间数据共享&守护线程&线程进程效率对比&锁(死锁/递归锁)

1.线程理论以及线程的两种创建方法 2.线程之间是数据共享的与join方法 3.多线程和多进程的效率对比 4.数据共享的补充线程开启太快 5.线程锁 互斥锁 同步锁 6.死锁现象和递归锁 7.守护线程和守护进程的对比 8.补充 9.GIL锁&GIL锁与线程锁的区别 10.GIL锁补充 11.信号量 时间补充说明 原文地址:https://www.cnblogs.com/studybrother/p/10269278.html

python-GIL、死锁递归锁及线程补充

一.GIL介绍 GIL全称 Global Interpreter Lock ,中文解释为全局解释器锁.它并不是Python的特性,而是在实现python的主流Cpython解释器时所引入的一个概念,CIL本质上就是一把互斥锁,将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,从而保证数据的安全性. 注:每次执行python程序,都会产生一个独立的进程,进程里除了能看到的若干线程,还有看不见的解释器开启的垃圾回收等解释器级别的线程. #1 所有数据都是共享的,这其中,代码作为一

并发编程--CAS自旋锁

在前两篇博客中我们介绍了并发编程--volatile应用与原理和并发编程--synchronized的实现原理(二),接下来我们介绍一下CAS自旋锁相关的知识. 一.自旋锁提出的背景 由于在多处理器系统环境中有些资源因为其有限性,有时需要互斥访问(mutual exclusion),这时会引入锁的机制,只有获取了锁的进程才能获取资源访问.即是每次只能有且只有一个进程能获取锁,才能进入自己的临界区,同一时间不能两个或两个以上进程进入临界区,当退出临界区时释放锁.设计互斥算法时总是会面临一种情况,即

线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁

线程(from threading import Thread):CPU调度的最小单位 线程的两种创建方式:方式一: 1 from threading import Thread 2 def f1(i): 3 print(i) 4 if __name__ == '__main__': 5 for i in range(10): 6 t = Thread(target=f1,args=(i,)) 7 t.start() 8 print('主线程') 方式二: 1 from threading im