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 30 Python
Python使用pylab库实现画线功能的方法详解
Jun 08 Python
Python实现网站注册验证码生成类
Jun 08 Python
python对excel文档去重及求和的实例
Apr 18 Python
python 读取txt,json和hdf5文件的实例
Jun 05 Python
PyQt4实时显示文本内容GUI的示例
Jun 14 Python
Django 查询数据库并返回页面的例子
Aug 12 Python
python itsdangerous模块的具体使用方法
Feb 17 Python
浅谈python出错时traceback的解读
Jul 15 Python
浅析python连接数据库的重要事项
Feb 22 Python
Python带你从浅入深探究Tuple(基础篇)
May 15 Python
python接口测试返回数据为字典取值方式
Feb 12 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
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
jquery限制输入字数,并提示剩余字数实现代码
2012/12/24 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
jquery中的查找parents与closest方法之间的区别
2013/12/02 Javascript
window.showModalDialog()返回值的学习心得总结
2014/01/07 Javascript
js实现跨域的方法实例详解
2015/06/24 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
2016/06/07 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
jQuery实现的无限级下拉菜单功能示例
2016/09/12 Javascript
jquery 抽奖小程序实现代码
2016/10/12 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
浅谈Vue2.0父子组件间事件派发机制
2018/01/08 Javascript
Vue cli+mui 区域滚动的实例代码
2018/01/25 Javascript
浅谈React 服务器端渲染的使用
2018/05/08 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
angular异步验证防抖踩坑实录
2019/12/01 Javascript
微信小程序如何实现radio单选框单击打勾和取消
2020/01/21 Javascript
javascript 函数的暂停和恢复实例详解
2020/04/25 Javascript
使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子
2014/04/15 Python
详解python 发送邮件实例代码
2016/12/22 Python
利用python实现简单的邮件发送客户端示例
2017/12/23 Python
Pandas实现数据类型转换的一些小技巧汇总
2018/05/07 Python
对python特殊函数 __call__()的使用详解
2019/07/02 Python
python读取tif图片时保留其16bit的编码格式实例
2020/01/13 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
python+django+selenium搭建简易自动化测试
2020/08/19 Python
体验完美剃须:The Art of Shaving
2018/08/06 全球购物
美国家庭鞋店:Shoe Sensation
2019/09/27 全球购物
大学团支书的自我评价分享
2013/12/14 职场文书
幼儿园中班开学寄语
2014/04/03 职场文书
党员四风问题对照检查材料
2014/09/27 职场文书
2014年机关党建工作总结
2014/11/11 职场文书
暑期家教宣传单
2015/07/14 职场文书
莫言诺贝尔获奖感言(全文)
2015/07/31 职场文书
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android