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信号量的主要内容,如果未能解决你的问题,请参考以下文章
11.python并发入门(part6 Semaphore信号量)