python线程信号量semaphore使用解析


Posted in Python onNovember 30, 2019

这篇文章主要介绍了python线程信号量semaphore使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一.semaphore信号量原理

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

二.semaphore信号量相关函数介绍

acquire() — 消耗信号量,内置计数器减一;

release() — 释放信号量,内置计数器加一;

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

三.semaphore信号量使用

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

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:何以解忧
@Blog(个人博客地址): shuopython.com
@WeChat Official Account(微信公众号):猿说python
@Github:www.github.com
 
@File:python_semaphore.py
@Time:2019/10/23 21:25
 
@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("程序结束!")

输出结果:

当前时间: Wed Oct 23 22:21:59 2019
当前时间: Wed Oct 23 22:21:59 2019
当前时间: Wed Oct 23 22:21:59 2019
当前时间: Wed Oct 23 22:21:59 2019
当前时间: Wed Oct 23 22:21:59 2019
当前时间: Wed Oct 23 22:22:01 2019
当前时间: Wed Oct 23 22:22:01 2019
当前时间: Wed Oct 23 22:22:01 2019
当前时间: Wed Oct 23 22:22:01 2019
当前时间: Wed Oct 23 22:22:01 2019
当前时间: Wed Oct 23 22:22:03 2019
当前时间: Wed Oct 23 22:22:03 2019
当前时间: Wed Oct 23 22:22:03 2019
当前时间: Wed Oct 23 22:22:03 2019
当前时间: Wed Oct 23 22:22:03 2019
当前时间: Wed Oct 23 22:22:05 2019
当前时间: Wed Oct 23 22:22:05 2019
当前时间: Wed Oct 23 22:22:05 2019
当前时间: Wed Oct 23 22:22:05 2019
当前时间: Wed Oct 23 22:22:05 2019
程序结束!

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 编码处理-str与Unicode的区别
Sep 06 Python
完美解决python遍历删除字典里值为空的元素报错问题
Sep 11 Python
Python 获得命令行参数的方法(推荐)
Jan 24 Python
Python对多属性的重复数据去重实例
Apr 18 Python
深入浅析python 中的匿名函数
May 21 Python
python进行文件对比的方法
Dec 24 Python
Python3 使用pillow库生成随机验证码
Aug 26 Python
PyQt5+Pycharm安装和配置图文教程详解
Mar 24 Python
Eclipse配置python默认头过程图解
Apr 26 Python
Python并发concurrent.futures和asyncio实例
May 04 Python
Matlab中plot基本用法的具体使用
Jul 17 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
Feb 18 Python
Python一行代码解决矩阵旋转的问题
Nov 30 #Python
Numpy之将矩阵拉成向量的实例
Nov 30 #Python
numpy np.newaxis 的实用分享
Nov 30 #Python
Python如何使用函数做字典的值
Nov 30 #Python
关于Numpy中的行向量和列向量详解
Nov 30 #Python
numpy:np.newaxis 实现将行向量转换成列向量
Nov 30 #Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
Nov 30 #Python
You might like
PHP函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
php gzip压缩输出的实现方法
2013/04/27 PHP
Drupal简体中文语言包安装教程
2014/09/27 PHP
PHP SPL标准库中的常用函数介绍
2015/05/11 PHP
php图片添加水印例子
2016/07/20 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
tp5.1 框架数据库高级查询技巧实例总结
2020/05/25 PHP
静态页面下用javascript操作ACCESS数据库(读增改删)的代码
2007/05/14 Javascript
Mootools 1.2教程 类(一)
2009/09/15 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
nodejs实现遍历文件夹并统计文件大小
2015/05/28 NodeJs
JavaScript中ES6字符串扩展方法
2016/08/26 Javascript
微信小程序 MD5的方法详解及实例代码
2017/03/10 Javascript
TypeScript入门-接口
2017/03/30 Javascript
用JS实现简单的登录验证功能
2017/07/28 Javascript
vuex与组件联合使用的方法
2018/05/10 Javascript
基于jQuery实现无缝轮播与左右点击效果
2018/05/13 jQuery
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
解决python 无法加载downsample模型的问题
2018/10/25 Python
pytorch中nn.Conv1d的用法详解
2019/12/31 Python
python代码实现TSNE降维数据可视化教程
2020/02/28 Python
opencv python在视屏上截图功能的实现
2020/03/05 Python
Pycharm中如何关掉python console
2020/10/27 Python
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
Canvas实现保存图片到本地的示例代码
2018/06/28 HTML / CSS
MyBag中文网:英国著名的时尚包袋电商零售网站
2020/07/31 全球购物
十佳教师事迹材料
2014/01/11 职场文书
庆中秋节主题活动方案
2014/02/03 职场文书
应届大专生自荐书
2014/06/16 职场文书
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书
廉政党课工作报告案例
2019/06/21 职场文书
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android