Python的线程11 Semaphore信号量

Posted 雷学委

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python的线程11 Semaphore信号量相关的知识,希望对你有一定的参考价值。

正式的Python专栏第48篇,同学站住,别错过这个从0开始的文章!

前面说到的Event,学委觉得它就像一个总开关一样,一开全开。

这篇我们讲讲thread.Semaphore这个类。

什么是Semaphore

Semaphore 也就是信号量, 跟Event和Lock很不一样。

Semapore允许传入一个初始数值,这个数值限定了可以顺畅调用acquire的次数

threading.Semaphore(3) #运行3个线程同时acquire不阻塞,如果有4个线程acquire将有一个线程等待。

顺畅调用就是调用的时候不阻塞不需要等待。

超过限定次数,就无法顺畅调用了,那就堵在这了。

直到有人释放了锁,其他阻塞的线程再去抢锁继续运行。

下面还是前面Event的demo程序,学委把Event改成了Semaphore类,设置了初始值为1。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/27 10:43 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : thread_event.py
# @Project : hello
import threading
import time

xuewei_semaphore = threading.Semaphore(1)

print("xuewei_semaphore:", xuewei_semaphore)


def run():
    print(" %s ready" % threading.current_thread().name)
    xuewei_semaphore.acquire()
    print(" %s go" % threading.current_thread().name)
    time.sleep(0.5)
    print(" %s completed" % threading.current_thread().name)


threads = []
for i in range(4):
    t_name = "t-" + str(i)
    t = threading.Thread(name=t_name, target=run)
    threads.append(t)
    t.start()

# 学委提示:赛场鸣枪,运动员开跑
for i in [3, 2, 1]:
    print("学委倒数 count %s" % i)
    time.sleep(1)

for t in threads:
    t.join()

结果呢,学委还没有喊3/2/1,第一个运动员就先跑到,还没有喊完3/2/1,这个运动就已经跑到终点了(第一个线程先结束了)。

其他两个运动员就很乖,还在哪里等待。

当然以上结果都是如预期执行的,没有bug.

Semaphore信号量就是这样。

读者不妨把threading.Semaphore传入的初始值改为2/3/4,观察一下运行结果。

xuewei_semaphore = threading.Semaphore(2)
#或者改为4
xuewei_semaphore = threading.Semaphore(4)

总结

本篇先简单介绍信号量,下一篇学委会运用信号量做一个简易限流器。

编程还是挺好玩的。 喜欢Python的朋友,请关注学委的 Python基础专栏 or Python入门到精通大专栏

持续学习持续开发,我是雷学委!
编程很有趣,关键是把技术搞透彻讲明白。
欢迎关注微信,点赞支持收藏!

以上是关于Python的线程11 Semaphore信号量的主要内容,如果未能解决你的问题,请参考以下文章

Python的线程11 Semaphore信号量

11.python并发入门(part6 Semaphore信号量)

Python 线程信号量 semaphore

python线程信号量semaphore(33)

Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例

python基础 信号量 semaphore evevt 线程queue 生产者消费者模型