目录

  • 一.Python 线程信号量 semaphore 简介
  • 二.Python 线程信号量 semaphore 原理
  • 三.Python 线程信号量 semaphore 函数介绍
  • 四.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零基础入门教程相关推荐

  1. python怎么输出浮点数_python 零基础入门教程第 2 章:基本数据类型 (一)

    一.什么是数据类型 编程语言通过一些复杂的计算机物理底层机制,创造不同类型的数据,用来表示现实世界中的不同信息,以便于计算机更好的存储和计算. 每种编程语言都会有一些基本的数据类型用来表示现实世界中的 ...

  2. Python 线程池 ThreadPoolExecutor(二) - Python零基础入门教程

    目录 一.Python 线程池前言 二.Python 线程池 ThreadPoolExecutor 常用函数 1.线程池 as_completed 函数使用 2.线程池 map 函数使用 3.线程池 ...

  3. Python 线程池 ThreadPoolExecutor(一) - Python零基础入门教程

    目录 一.Python 线程池前言 二.Python 线程池原理 三.Python 线程池 ThreadPoolExecutor 函数介绍 四.Python 线程池 ThreadPoolExecuto ...

  4. Python 线程优先队列 PriorityQueue - Python零基础入门教程

    目录 一.Python 线程队列 Queue 分类 二.Python 线程优先队列 PriorityQueue 简介 三.Python 线程优先队列 PriorityQueue 函数介绍 四.Pyth ...

  5. Python 线程队列 LifoQueue – LIFO - Python零基础入门教程

    目录 一.Python 线程队列 Queue 分类 二.Python 线程先进后出队列 LifoQueue 简介 三.Python 线程先进后出队列 LifoQueue 函数介绍 四.Python 线 ...

  6. Python 线程队列 Queue – FIFO - Python零基础入门教程

    目录 一.Python 线程队列分类 二.Python 线程先进先出队列 Queue 简介 三.Python 线程先进先出队列 Queue 常用函数 四.Python 线程先进先出队列 Queue 使 ...

  7. Python 线程障碍对象 Barrier - Python零基础入门教程

    目录 一.Python 线程障碍对象 Barrier 简介 二.Python 线程障碍对象 Barrier 原理 三.Python 线程障碍对象 Barrier 函数介绍 四.Python 线程障碍对 ...

  8. Python 进程 Process 与线程 threading 区别 - Python零基础入门教程

    目录 一.Python 线程 threading 创建 二.Python 进程 Process 创建 三.Python 进程 Process 和线程 threading 区别 四.Python 进程 ...

  9. Python globals 函数 - Python零基础入门教程

    目录 一.Python globals 函数语法 二.Python globals 函数使用 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Pytho ...

最新文章

  1. Verilog初级教程(9)Verilog的运算符
  2. 双向链表的建立、插入、删除、
  3. Linux 上的最佳 C/C++ IDE
  4. 如何修改作者名称_PS2019中如何扩展文本选区 ps扩展文本选区的图文教程_photoshop教程...
  5. Oracle创建 表空间 用户 给用户授权命令
  6. SAP CRM WebClient UI和Hybris CommerceUI tag的渲染逻辑
  7. 误删了计算机桌面回收站,我电脑回收站里的东西已经被删除几天了?怎么可以找回!谢谢...
  8. 历时半载,我的新课上线了
  9. BZOJ 3190: [JLOI2013]赛车
  10. Atitit 摄像头与主机连接方式大总结
  11. [数理统计-逐步回归]国内旅游收入回归
  12. slqmf刀模工具_slq刀模绘图插件下载|
  13. matlab图无线型,如何使用MATLAB进行移动无线信道模型的建模资料概述
  14. 什么是 SEO ??? 对SEO的详细介绍
  15. 【公告】博客专家4月发布原创/翻译奖励发放
  16. CSS3的2D、3D变换、过度与动画效果
  17. 芯片android区别,同样芯片会有不同表现吗?Reno5 Pro+告诉你答案
  18. 自动驾驶软件开发人才现状_新技术改变传统出行方式 多国自动驾驶行业现状及人才需求分析...
  19. Web移动应用的未来:使用HTML5和CSS
  20. 达人评测 i3 13100f和i3 12100F选哪个好 i312100F和13100f差距

热门文章

  1. 37 手游基于 Flink CDC + Hudi 湖仓一体方案实践
  2. mPaaS:全新移动开发平台,只为打造性能更优越的App
  3. 开启阿里云对象存储OSS防误删新功能,保护您珍贵的数据。
  4. 基于融合计算?蚂蚁金服的在线机器学习是如何做的
  5. 机器学习在高德起点抓路中的应用实践
  6. 移动云TeaTalk:这是一场云数据库技术的深度对话!
  7. 当数据中台遇见云原生,智领云看到企业数据转型新方向
  8. 13种重要的云原生工具,让交付过程更快
  9. 推出超低功耗数字式热释电传感器,翠展微电子厉害了……
  10. 厉害!中国AI企业50强榜单!看完员工待遇,网友:我酸了!