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中lambda函数 list comprehension 和 zip函数使用指南
Sep 28 Python
Python中的默认参数详解
Jun 24 Python
Python selenium 三种等待方式解读
Sep 15 Python
ubuntu安装mysql pycharm sublime
Feb 20 Python
python+pyqt5实现KFC点餐收银系统
Jan 24 Python
python try except返回异常的信息字符串代码实例
Aug 15 Python
Python阶乘求和的代码详解
Feb 14 Python
Python3连接Mysql8.0遇到的问题及处理步骤
Feb 17 Python
python 读取.nii格式图像实例
Jul 01 Python
有关pycharm登录github时有的时候会报错connection reset的问题
Sep 15 Python
利用Python将多张图片合成视频的实现
Nov 23 Python
Python之matplotlib绘制饼图
Apr 13 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和JAVA中的重载(overload)和覆盖(override) 介绍
2012/03/01 PHP
php 使用curl模拟ip和来源进行访问的实现方法
2017/05/02 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
将字符串转换成gb2312或者utf-8编码的参数(js版)
2013/04/10 Javascript
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
2014/06/20 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
Vue方法与事件处理器详解
2016/12/01 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
JS中使用 after 伪类清除浮动实例
2017/03/01 Javascript
angular 用拦截器统一处理http请求和响应的方法
2017/06/08 Javascript
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
vue-cli3脚手架的配置及使用教程
2018/08/28 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
Echarts实现单条折线可拖拽效果
2019/12/19 Javascript
[02:57]DOTA2英雄基础教程 风行者
2014/01/16 DOTA
Python实现类继承实例
2014/07/04 Python
Python Requests安装与简单运用
2016/04/07 Python
python 调用c语言函数的方法
2017/09/29 Python
详解python使用Nginx和uWSGI来运行Python应用
2018/01/09 Python
python爬取个性签名的方法
2018/06/17 Python
python如何保证输入键入数字的方法
2019/08/23 Python
opencv实现简单人脸识别
2021/02/19 Python
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
在tensorflow中设置保存checkpoint的最大数量实例
2020/01/21 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的方法
2014/04/03 HTML / CSS
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
基于HTML5 WebGL的3D机房的示例
2018/03/16 HTML / CSS
加拿大最大的钻石商店:Peoples Jewellers
2018/01/01 全球购物
美国精油公司:Plant Therapy
2019/05/17 全球购物
2014年党总支工作总结
2014/12/18 职场文书
会计岗位职责
2015/02/03 职场文书
mysql 索引合并的使用
2021/08/30 MySQL