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文件和目录操作方法大全(含实例)
Mar 12 Python
Python获取脚本所在目录的正确方法
Apr 15 Python
同时安装Python2 & Python3 cmd下版本自由选择的方法
Dec 09 Python
Python从零开始创建区块链
Mar 06 Python
python实现归并排序算法
Nov 22 Python
500行Python代码打造刷脸考勤系统
Jun 03 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
Jul 08 Python
Python的log日志功能及设置方法
Jul 11 Python
Python 实现Image和Ndarray互相转换
Feb 19 Python
Python安装OpenCV的示例代码
Mar 05 Python
Python使用扩展库pywin32实现批量文档打印实例
Apr 09 Python
Python描述数据结构学习之哈夫曼树篇
Sep 07 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 Memcache 中实现消息队列
2009/11/24 PHP
php5.3以后的版本连接sqlserver2000的方法
2014/07/28 PHP
php+ajax无刷新分页实例详解
2015/12/07 PHP
php如何把表单内容提交到数据库
2019/07/08 PHP
从盛大通行证上摘下来的身份证验证js代码
2011/01/11 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
Jquery中的层次选择器与find()的区别示例介绍
2014/02/20 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
2015/02/11 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
JS原型链怎么理解
2016/06/27 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
Vue封装的可编辑表格插件方法
2018/08/28 Javascript
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
vue项目中在外部js文件中直接调用vue实例的方法比如说this
2019/04/28 Javascript
vue使用showdown并实现代码区域高亮的示例代码
2019/10/17 Javascript
jQuery+ajax实现用户登录验证
2020/09/13 jQuery
Python可变参数*args和**kwargs用法实例小结
2018/04/27 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
2019/07/31 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
专门出售各种儿童读物的网站:Put Me In The Story
2016/08/07 全球购物
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
PHP如何与mysql建立链接
2013/05/05 面试题
护理职业应聘自荐书
2013/09/29 职场文书
四年大学自我鉴定
2014/02/17 职场文书
龙潭大峡谷导游词
2015/02/10 职场文书
小学课改工作总结
2015/08/13 职场文书
Html分层的box-shadow效果的示例代码
2021/03/30 HTML / CSS
Python pandas之求和运算和非空值个数统计
2021/08/07 Python
nginx.conf配置文件结构小结
2022/04/08 Servers
python和C/C++混合编程之使用ctypes调用 C/C++的dll
2022/04/29 Python