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 实时遍历日志文件
Apr 12 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
May 03 Python
Python实现单词翻译功能
Jun 06 Python
机器学习python实战之手写数字识别
Nov 01 Python
Python实现string字符串连接的方法总结【8种方式】
Jul 06 Python
浅谈python 导入模块和解决文件句柄找不到问题
Dec 15 Python
在Pycharm中设置默认自动换行的方法
Jan 16 Python
python使用threading.Condition交替打印两个字符
May 07 Python
Python学习笔记之变量、自定义函数用法示例
May 28 Python
python中with语句结合上下文管理器操作详解
Dec 19 Python
Tensorflow 模型转换 .pb convert to .lite实例
Feb 12 Python
python制作抽奖程序代码详解
Jan 15 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
咖啡冲泡指南 咖啡有哪些制作方式 单品咖啡 意式咖啡
2021/03/06 冲泡冲煮
解析wamp5下虚拟机配置文档
2013/06/27 PHP
thinkphp Apache配置重启Apache1 restart 出错解决办法
2017/02/15 PHP
PHP 7.4中使用预加载的方法详解
2019/07/08 PHP
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
运用jquery实现table单双行不同显示并能单行选中
2009/07/25 Javascript
JavaScript中yield实用简洁实现方式
2010/06/12 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
js 获取class的元素的方法 以及创建方法getElementsByClassName
2013/03/11 Javascript
JQuery的自定义事件代码,触发,绑定简单实例
2013/08/01 Javascript
jQuery幻灯片特效代码分享--鼠标滑过按钮时切换(2)
2020/11/18 Javascript
以JavaScript来实现WordPress中的二级导航菜单的方法
2015/12/14 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
老生常谈javascript中逻辑运算符&&和||的返回值问题
2017/04/13 Javascript
vue-loader教程介绍
2017/06/14 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
小程序实现多列选择器
2019/02/15 Javascript
layui radio单选限制下一个radio单选的实例
2019/09/03 Javascript
浅谈JS中几种轻松处理'this'指向方式
2019/09/16 Javascript
js实现打字小游戏
2019/12/17 Javascript
VUE子组件向父组件传值详解(含传多值及添加额外参数场景)
2020/09/01 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
[02:20]DOTA2英雄基础教程 黑暗贤者
2013/12/19 DOTA
[08:42]DOTA2每周TOP10 精彩击杀集锦vol.2
2014/06/25 DOTA
Python接收Gmail新邮件并发送到gtalk的方法
2015/03/10 Python
Python函数式编程指南(二):从函数开始
2015/06/24 Python
玩转python爬虫之URLError异常处理
2016/02/17 Python
Windows下安装python2和python3多版本教程
2017/03/30 Python
纯python进行矩阵的相乘运算的方法示例
2019/07/17 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
阿尔卡特(中国)的面试题目
2014/08/20 面试题
就业推荐表自我鉴定
2014/03/21 职场文书
销售主管竞聘书
2014/03/31 职场文书
村官个人总结范文
2015/03/03 职场文书
详解CocosCreator消息分发机制
2021/04/16 Javascript