Python 线程信号量 semaphore

Posted 猿说编程

tags:

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

目录

零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门

一.Python 线程信号量 semaphore 简介

通过前面对 线程互斥锁 lock / 线程事件 event / 线程条件变量 condition / 线程定时器 timer 的讲解,相信你对线程 threading 模块已经有了一定的了解,同时执行多个线程的确可以提高程序的效率,但是并非线程的数量越多越好,可能对于计算机而言,你直接运行 20 ~ 30 线程可能没太大影响,如果同时运行上千个甚至上万个呢?我相信你电脑会直接瘫痪……

二.Python 线程信号量 semaphore 原理

多线程同时运行,能提高程序的运行效率,但是并非线程越多越好,而 semaphore 信号量可以通过内置计数器来控制同时运行线程的数量,启动线程(消耗信号量)内置计数器会自动减一,线程结束(释放信号量)内置计数器会自动加一;内置计数器为零,启动线程会阻塞,直到有本线程结束或者其他线程结束为止;

三.Python 线程信号量 semaphore 函数介绍

  • **acquire **— 消耗信号量,内置计数器减一;
  • **release **— 释放信号量,内置计数器加一;

在 semaphore 信号量有一个内置计数器,控制线程的数量,acquire 会消耗信号量,计数器会自动减一;release 会释放信号量,计数器会自动加一;当计数器为零时,acquire 调用被阻塞,直到 release 释放信号量为止。

四.Python 线程信号量 semaphore 使用

创建多个线程,限制同一时间最多运行 5 个线程,示例代码如下:

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 线程信号量 semaphore.py
@Time:2021/05/04 07:37
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

"""

# 导入线程模块
import threading
# 导入时间模块
import time

# 添加一个计数器,最大并发线程数量5(最多同时运行5个线程)
semaphore = threading.Semaphore(5)

def foo():
    semaphore.acquire()    #计数器获得锁
    time.sleep(2)   #程序休眠2秒
    print("当前时间:",time.ctime()) # 打印当前系统时间
    semaphore.release()    #计数器释放锁


if __name__ == "__main__":

    thread_list= list()
    for i in range(20):
        t=threading.Thread(target=foo,args=()) #创建线程
        thread_list.append(t)
        t.start()  #启动线程

    for t in thread_list:
        t.join()

    print("程序结束!")


\'\'\'
输出结果:

当前时间: Tue May  4 12:01:43 2021
当前时间: Tue May  4 12:01:43 2021
当前时间: Tue May  4 12:01:43 2021
当前时间: Tue May  4 12:01:43 2021
当前时间: Tue May  4 12:01:43 2021
当前时间: Tue May  4 12:01:45 2021
当前时间: Tue May  4 12:01:45 2021
当前时间: Tue May  4 12:01:45 2021
当前时间: Tue May  4 12:01:45 2021
当前时间: Tue May  4 12:01:45 2021
当前时间: Tue May  4 12:01:47 2021
当前时间: Tue May  4 12:01:47 2021
当前时间: Tue May  4 12:01:47 2021
当前时间: Tue May  4 12:01:47 2021
当前时间: Tue May  4 12:01:47 2021
当前时间: Tue May  4 12:01:49 2021
当前时间: Tue May  4 12:01:49 2021
当前时间: Tue May  4 12:01:49 2021
当前时间: Tue May  4 12:01:49 2021
当前时间: Tue May  4 12:01:49 2021
程序结束!

Process finished with exit code 0

\'\'\'

根据打印的日志可以看出,同一时间只有 5 个线程运行,间隔两秒之后,再次启动 5 个线程,直到 20 个线程全部运行结束为止;如果没有设置信号量 Semapaore ,创建线程直接 start ,输出的时间全部都是一样的,这个问题比较简单,可以自己去实验一下!

五.猜你喜欢

  1. Python 条件推导式
  2. Python 列表推导式
  3. Python 字典推导式
  4. Python 函数声明和调用
  5. Python 不定长参数 *argc/**kargcs
  6. Python 匿名函数 lambda
  7. Python return 逻辑判断表达式
  8. Python 字符串/列表/元组/字典之间的相互转换
  9. Python 局部变量和全局变量
  10. Python type 函数和 isinstance 函数区别
  11. Python is 和 == 区别
  12. Python 可变数据类型和不可变数据类型
  13. Python 浅拷贝和深拷贝
  14. Python 文件读写操作
  15. Python 异常处理
  16. Python 模块 import
  17. Python __name__ == ‘__main__’详细解释

未经允许不得转载:猿说编程 » Python 线程信号量 semaphore

本文由博客 - 猿说编程 猿说编程 发布!

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

python线程信号量semaphore(33)

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

python,信号量,semaphore

python多线程-Semaphore(信号对象)

Python的线程11 Semaphore信号量

Python的线程11 Semaphore信号量