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 re模块介绍
Nov 30 Python
Pthon批量处理将pdb文件生成dssp文件
Jun 21 Python
Python如何读取MySQL数据库表数据
Mar 11 Python
django rest framework之请求与响应(详解)
Nov 06 Python
python设置值及NaN值处理方法
Jul 03 Python
Python设计模式之状态模式原理与用法详解
Jan 15 Python
Python中字符串与编码示例代码
May 20 Python
对Django 中request.get和request.post的区别详解
Aug 12 Python
布隆过滤器的概述及Python实现方法
Dec 08 Python
python实现四人制扑克牌游戏
Apr 22 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
May 26 Python
LyScript实现绕过反调试保护的示例详解
Aug 14 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系统流量分析的程序
2006/10/09 PHP
PHP的开发框架的现状和展望
2007/03/16 PHP
解析PHP 5.5 新特性
2013/07/02 PHP
PHP打开和关闭文件操作函数总结
2014/11/18 PHP
php在apache环境下实现gzip配置方法
2015/04/02 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
2017/06/17 PHP
PHP Trait功能与用法实例分析
2020/06/03 PHP
用JavaScript 处理 URL 的两个函数代码
2007/08/13 Javascript
写自已的js类库需要的核心代码
2012/07/16 Javascript
js 操作select与option(示例讲解)
2013/12/20 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
2014/03/12 Javascript
网页广告中JS代码的信息监听示例
2014/04/02 Javascript
JS实现的一个简单的Autocomplete自动完成例子
2014/04/16 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
jQuery制作效果超棒的手风琴折叠菜单
2015/04/03 Javascript
jQuery的animate函数实现图文切换动画效果
2015/05/03 Javascript
TypeOf这些知识点你了解吗
2016/02/21 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
JS实现合并json对象的方法
2017/10/10 Javascript
详解Vue中的基本语法和常用指令
2019/07/23 Javascript
jQuery实现验证用户登录
2019/12/10 jQuery
vue 页面回退mounted函数不执行的解决方案
2020/07/26 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
Python 列表list使用介绍
2014/11/30 Python
Python wxPython库消息对话框MessageDialog用法示例
2018/09/03 Python
python3 中文乱码与默认编码格式设定方法
2018/10/31 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
python 提取tuple类型值中json格式的key值方法
2018/12/31 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
如何现实servlet的单线程模式
2014/08/05 面试题
销售自荐信
2013/10/22 职场文书
青年教师典范事迹材料
2014/01/31 职场文书
mysql timestamp比较查询遇到的坑及解决
2021/11/27 MySQL
【海涛教你打DOTA】剑圣第一人称视角解说
2022/04/01 DOTA