avatar

刘刚刚的blog

采菊东篱下,悠然见南山🦥

  • 首页
  • 大模型应用
  • 常用软件/工具
  • Halo
  • 关于
Home python中常见的锁
文章

python中常见的锁

Posted 2020-09-12 Updated 2024-12- 10
By Administrator
5~6 min read

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


死锁与递归锁

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

死锁示例:

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()

python
python
License:  CC BY 4.0
Share

Further Reading

Apr 21, 2025

Typing

类型注释让python 有了更好的编辑器提示功能。 基础使用 对函数参数和返回值,进行类型注释 def surface_area_of_cube(edge_length: float) -> str:    return f"The surface area of the cube is {6 *

Feb 25, 2025

python多进程多线程下的计数及日志打印

注意点: 需要保证在多进程内的进程锁是同一个 需要保证在单进程中的多线程内线程锁是同一个 # logger.py import multiprocessing import threading ​ ​ class Logger_test:    def __init__(self, process

Dec 25, 2022

python-迭代器、生成器、协程

迭代器 Python中当容器对象提供了对迭代的支持时,可以通过container.__iter__()来返回一个迭代器对象。 迭代器需要支持以下两个方法,这两个方法共同构成了迭代器协议: iterator.__iter__() 该方法返回迭代器本身,这个方法是配合for和in使用所必须的。 iter

OLDER

gevent实现协程

NEWER

常见的IO模型

Recently Updated

  • 文本切分-语义分割(Semantic Chunking)
  • dify 并发配置优化
  • Typing
  • 大模型返回中json_schema与json_mode的区别
  • Async

Trending Tags

Halo 运维 postgresql 设计模式 linux就该这么学 nas rag odoo python 文本切分

Contents

©2025 刘刚刚的blog. Some rights reserved.

Using the Halo theme Chirpy