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的Flask框架实现视频的流媒体传输
Mar 31 Python
Python中文分词实现方法(安装pymmseg)
Jun 14 Python
Python实现运行其他程序的四种方式实例分析
Aug 17 Python
python中数据爬虫requests库使用方法详解
Feb 11 Python
Django 使用easy_thumbnails压缩上传的图片方法
Jul 26 Python
在python Numpy中求向量和矩阵的范数实例
Aug 26 Python
python 实现生成均匀分布的点
Dec 05 Python
使用pytorch完成kaggle猫狗图像识别方式
Jan 10 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
Feb 12 Python
Python基于requests实现模拟上传文件
Apr 21 Python
python实现进度条的多种实现
Apr 29 Python
PYTHON 使用 Pandas 删除某列指定值所在的行
Apr 28 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
967 个函式
2006/10/09 PHP
PHP OPCode缓存 APC详细介绍
2010/10/12 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
再Docker中架设完整的WordPress站点全攻略
2015/07/29 PHP
php项目中类的自动加载实例讲解
2019/09/12 PHP
菜鸟javascript基础整理1
2010/12/06 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
详解JavaScript权威指南之对象
2016/09/27 Javascript
Bootstrop实现多级下拉菜单功能
2016/11/24 Javascript
Vue组件开发初探
2017/02/14 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
微信小程序 高德地图路线规划实现过程详解
2019/08/05 Javascript
原生js实现可兼容PC和移动端的拖动滑块功能详解【测试可用】
2019/08/15 Javascript
react MPA 多页配置详解
2019/10/18 Javascript
原生js实现的观察者和订阅者模式简单示例
2020/04/18 Javascript
解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题
2020/07/28 Javascript
[01:15:12]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#4Newbee VS CDEC
2016/03/03 DOTA
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
tf.truncated_normal与tf.random_normal的详细用法
2018/03/05 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
HTML5拖放功能_动力节点Java学院整理
2017/07/13 HTML / CSS
html5 跨文档消息传输示例探讨
2013/04/01 HTML / CSS
德国运动鞋网上商店:Afew Store
2018/01/05 全球购物
Eton丹麦官网:精美的男式衬衫
2020/05/27 全球购物
宣传标语大全
2014/07/01 职场文书
房地产经营管理专业自荐信
2014/09/02 职场文书
财务整改报告范文
2014/11/05 职场文书
2015年化验室工作总结
2015/04/23 职场文书
JavaScript的Set数据结构详解
2022/02/18 Javascript