刘刚刚的个人博客

常见的锁

创建时间:2020-09-12 11:32:52
更新时间:2020-09-12 11:32:52

通过锁可以保证线程与进程的安全

死锁与递归锁

死锁:当一个线程或者进程抢到了一把锁,且执行下一步的操作时,还需要一把锁,但是这把锁被另外一个进程或者线程拿到了,那么就会出现死锁现象。

死锁示例:

from threading import Thread, Lock
import time


mutexA = Lock()
mutexB = Lock()
# 类只要加括号多次 产生的肯定是不同的对象
# 如果你想要实现多次加括号等到的是相同的对象 单例模式


class MyThead(Thread):
    def run(self):
        self.func1()
        self.func2()

    def func1(self):
        mutexA.acquire()
        print('%s 抢到A锁'% self.name)  
        mutexB.acquire()
        print('%s 抢到B锁'% self.name)
        mutexB.release()
        mutexA.release()
        
    def func2(self):
        mutexB.acquire()
        print('%s 抢到B锁'% self.name)
        time.sleep(2)
        mutexA.acquire()
        print('%s 抢到A锁'% self.name)  
        mutexA.release()
        mutexB.release()


if __name__ == '__main__':
    for i in range(10):
        t = MyThead()
        t.start()

递归锁可以让一个锁可以被多次加锁,同时解锁与需要相应的次数。

from threading import Thread, RLock
A = Lock()

# 加锁(可加多次)
A.acquire()

# 解锁(可多次)
A.release()

信号量

通过信号量,可以实现限制同时有几个线程同时执行的效果

from threading import Thread, Semaphore
import time
import random


se = Semaphore(5)  # 括号内写数字 写几就表示开设几个坑位


def task():
    se.acquire()
    print('启动' )
    time.sleep(random.randint(1, 5))
    se.release()


if __name__ == '__main__':
    for i in range(20):
        t = Thread(target=task,)
        t.start()

Event

当一个进程或者线程的某个动作执行完成,其他进程或者线程才能执行后续的任务

from threading import Thread, Event
import time

# 生成事件
event = Event()  


def light():
    print('红灯亮着的')
    time.sleep(3)
    print('绿灯亮了')
    # 设置事件
    event.set()


def car(name):
    print('%s 车正在灯红灯'%name)
    # 等待事件的通知,后续的代码需要 light中的envent.set()后才能执行
    event.wait()  
    print('%s 车加油门飙车走了'%name)


if __name__ == '__main__':
    t = Thread(target=light)
    t.start()

    for i in range(20):
        t = Thread(target=car, args=('%s'%i, ))
        t.start()
我的名片

昵称:shuta

职业:后台开发(python、php)

邮箱:648949076@qq.com

站点信息

建站时间: 2020/2/19
网站程序: ANTD PRO VUE + TP6.0
晋ICP备18007778号