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 splitlines使用技巧
Sep 06 Python
Python线程中对join方法的运用的教程
Apr 09 Python
Python logging管理不同级别log打印和存储实例
Jan 19 Python
Python常见数据结构之栈与队列用法示例
Jan 14 Python
django多种支付、并发订单处理实例代码
Dec 13 Python
django中的数据库迁移的实现
Mar 16 Python
python实现超级玛丽游戏
Mar 18 Python
Python实现手绘图效果实例分享
Jul 22 Python
python使用布隆过滤器的实现示例
Aug 20 Python
pycharm 关闭search everywhere的解决操作
Jan 15 Python
Django使用echarts进行可视化展示的实践
Jun 10 Python
Python制作春联的示例代码
Jan 22 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/03 冲泡冲煮
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
CI框架附属类用法分析
2018/12/26 PHP
支持ie与FireFox的剪切板操作代码
2009/09/28 Javascript
js获取指定的cookie的具体实现
2014/02/20 Javascript
jQuery实现HTML5 placeholder效果实例
2014/12/09 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
javascript移动开发中touch触摸事件详解
2016/03/18 Javascript
jQuery遍历DOM的父级元素、子级元素和同级元素的方法总结
2016/07/07 Javascript
深入理解bootstrap框架之第二章整体架构
2016/10/09 Javascript
使用Javascript监控前端相关数据的代码
2016/10/27 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
2017/01/24 Javascript
vue+elementUI实现表单和图片上传及验证功能示例
2019/05/14 Javascript
Vue数字输入框组件的使用方法
2019/10/19 Javascript
javascript自定义右键菜单插件
2019/12/16 Javascript
JavaScript常用8种数组去重代码实例
2020/09/09 Javascript
python中MySQLdb模块用法实例
2014/11/10 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
对python3中的RE(正则表达式)-详细总结
2019/07/23 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
2020/04/21 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
Python基于xlrd模块处理合并单元格
2020/07/28 Python
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
Java面向对象面试题
2016/12/26 面试题
学生评语大全
2014/04/18 职场文书
节能环保演讲稿
2014/08/28 职场文书
交通安全横幅标语
2014/10/07 职场文书
给客户的检讨书
2014/12/21 职场文书
2015毕业生简历自我评价
2015/03/02 职场文书
催款函范文
2015/06/24 职场文书
家属联谊会致辞
2015/07/31 职场文书
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js
Mysql如何查看是否使用到索引
2022/12/24 MySQL