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中super关键字用法实例分析
May 28 Python
Python中Collections模块的Counter容器类使用教程
May 31 Python
Python中不同进制的语法及转换方法分析
Jul 27 Python
批量获取及验证HTTP代理的Python脚本
Apr 23 Python
Python实现针对含中文字符串的截取功能示例
Sep 22 Python
Python命令行解析模块详解
Feb 01 Python
解决python3 urllib 链接中有中文的问题
Jul 16 Python
python入门:这篇文章带你直接学会python
Sep 14 Python
详解Python中的内建函数,可迭代对象,迭代器
Apr 29 Python
图解python全局变量与局部变量相关知识
Nov 02 Python
python科学计算之scipy——optimize用法
Nov 25 Python
深入了解Python enumerate和zip
Jul 16 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
再说下636单管机
2021/03/02 无线电
一些使用频率比较高的php函数
2008/10/03 PHP
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
文本框根据输入内容自适应高度的代码
2011/10/24 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
jquery animate实现鼠标放上去显示离开隐藏效果
2013/07/21 Javascript
node.js 开发指南 ? Node.js 连接 MySQL 并进行数据库操作
2014/07/29 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
详解Javascript继承的实现
2016/03/25 Javascript
浅谈关于angularJs中使用$.ajax的注意点
2017/08/12 Javascript
javascript回调函数详解
2018/02/06 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
Angular 组件之间的交互的示例代码
2018/03/24 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
2018/08/25 Javascript
详解JavaScript的数据类型以及数据类型的转换
2019/04/20 Javascript
JavaScript实现电灯开关小案例
2020/03/30 Javascript
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
[00:32]2018DOTA2亚洲邀请赛出场——VP
2018/04/04 DOTA
Python深入学习之装饰器
2014/08/31 Python
Python学习小技巧之利用字典的默认行为
2017/05/20 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
Python变量作用域LEGB用法解析
2020/02/04 Python
葡萄牙航空官方网站:TAP Air Portugal
2019/10/31 全球购物
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
什么是smarty? Smarty的优点是什么?
2013/08/11 面试题
后勤人员岗位职责
2013/12/17 职场文书
网络宣传方案
2014/03/15 职场文书
信息管理与信息系统专业求职信
2014/06/21 职场文书
2014个人四风对照检查材料思想汇报
2014/09/18 职场文书
优秀共产党员事迹材料
2014/12/18 职场文书
中标通知书格式
2015/04/17 职场文书
趣味运动会口号
2015/12/24 职场文书
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
2021/06/11 Python