Python实现简易的限流器介绍

 更新时间:2022年01月28日 11:07:17   作者:雷学委  
大家好,本篇文章主要讲的是Python实现简易的限流器介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

简单总结就是:动态的release,保证任意时刻都有固定数量可用的信号量。

我们通常会这样使用信号量

xuewei_semaphore = threading.Semaphore(4) #申请信号量

#在某个地方使用信号量
xuewei_semaphore.acquire()

//do something here
....

xuewei_semaphore.release()

限流的过程其实就是不断的使用这个有限信号量的过程。

因为设置了4信号额度,最多允许4个线程同时运行。

任意时间只要获取超过4个后,其他线程只能等待,这就跟我们进站排队很像。安检人员看到进入排队的人太多的,把后面的拦住,知道等候的人数减少,再放行一些人员进入车站等候区。

直接上代码吧,后面再解释。

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

xuewei_semaphore = threading.Semaphore(4)

print("xuewei_semaphore:", xuewei_semaphore)

waiting_for_train = {"value": 0}


def run():
    new_joiner = threading.current_thread().name
    # print(" %s ready" %new_joiner )
    xuewei_semaphore.acquire()
    print(" %s go" % new_joiner)
    waiting_for_train['value'] += 1
    time.sleep(1)
    print(" %s completed" % threading.current_thread().name)
    xuewei_semaphore.release()
    waiting_for_train['value'] -= 1


def log_the_waiting_area_status():
    while True:
        time.sleep(0.5)
        name = threading.current_thread().name
        print("name %s - size %s " % (name, waiting_for_train['value']))


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

for t in threads:
    t.join()

这里我们申请了信号量4个空槽。

然后启动100个线程,不停的去获取信号量,然后做完就释放。

同时我们有一个缓冲队列,只存放当前新进站的人数。

通过打印这个waiting_for_train的状态,我们可以看到任意时刻队列最多只有4人进入。

也不会超过4个。

运行效果

在运行过程,我们发现queue的大小一直为4.

屏幕快照 2022-01-21 上午12.50.51.png

最后所有进站人员都进站上车了,等候的人就清零了。

屏幕快照 2022-01-21 上午12.55.15.png

这里总共有102个线程,一个主线程,一个等候区状态展示线程,还有另外一个百个线程,代表了100个进站人员。

semaphore初始化了4个度量,所以每次最多可以进站等候的人数最多只有4个。

跟地铁拦截进站一样。

我们也可以尝试把进站处理的代码修改为下方代码,读者自行运行看一下效果。

xuewei_semaphore.acquire()
print(" %s go" % new_joiner)
waiting_for_train['value'] += 1
time.sleep(1)
waiting_for_train['value'] -= 1
print(" %s completed" % threading.current_thread().name)
xuewei_semaphore.release()

总结

好,这个限流器非常简单,配套在这个中级编程简单带过一下。

读者朋友们可以把代码拷贝,运行几次,思考一下。

到此这篇关于Python实现简易的限流器介绍的文章就介绍到这了,更多相关Python限流器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • TensorFlow搭建神经网络最佳实践

    TensorFlow搭建神经网络最佳实践

    这篇文章主要为大家详细介绍了TensorFlow搭建神经网络最佳实践,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • python实现简单点对点(p2p)聊天

    python实现简单点对点(p2p)聊天

    这篇文章主要为大家详细介绍了python实现简单点对点p2p聊天,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • python numpy之np.random的随机数函数使用介绍

    python numpy之np.random的随机数函数使用介绍

    这篇文章主要介绍了python numpy之np.random的随机数函数使用介绍,需要的朋友可以参考下
    2019-10-10
  • 详解PANDAS 数据合并与重塑(join/merge篇)

    详解PANDAS 数据合并与重塑(join/merge篇)

    这篇文章主要介绍了详解PANDAS 数据合并与重塑(join/merge篇),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • numpy 对矩阵中Nan的处理:采用平均值的方法

    numpy 对矩阵中Nan的处理:采用平均值的方法

    今天小编就为大家分享一篇numpy 对矩阵中Nan的处理:采用平均值的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Python利用Xpath选择器爬取京东网商品信息

    Python利用Xpath选择器爬取京东网商品信息

    这篇文章主要介绍了Python利用Xpath选择器爬取京东网商品信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • pandas 添加空列并赋空值案例

    pandas 添加空列并赋空值案例

    这篇文章主要介绍了pandas 添加空列并赋空值案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python基础之字典的详细使用教程

    Python基础之字典的详细使用教程

    字典作为Python的一个内置数据结构,和列表一样都是可变序列的,但是它是无序的,以键值对的方式存储数据。本文将详解一下Python中字典的使用,需要的可以参考一下
    2022-07-07
  • Python numpy生成矩阵、串联矩阵代码分享

    Python numpy生成矩阵、串联矩阵代码分享

    这篇文章主要介绍了Python numpy生成矩阵、串联矩阵代码分享,具有一定参考价值,需要的朋友可以了解下。
    2017-12-12
  • Win7上搭建Cocos2d-x 3.1.1开发环境

    Win7上搭建Cocos2d-x 3.1.1开发环境

    现在,越来越多的公司采用Cocos2d-x 3.0来开发游戏了,但是现在这样的文章并不多,所以打算写一系列来帮助初学者快速掌握Cocos2d-x 3.0。首先就从开发环境的大家说起吧
    2014-07-07

最新评论