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中通过threading模块定义和调用线程的方法
Jul 12 Python
Python实现自动添加脚本头信息的示例代码
Sep 02 Python
Python实现Mysql数据库连接池实例详解
Apr 11 Python
Selenium(Python web测试工具)基本用法详解
Aug 10 Python
详解解决Python memory error的问题(四种解决方案)
Aug 08 Python
python pprint模块中print()和pprint()两者的区别
Feb 10 Python
python列表返回重复数据的下标
Feb 10 Python
如何在scrapy中集成selenium爬取网页的方法
Nov 18 Python
通用的Django注册功能模块实现方法
Feb 05 Python
pandas apply使用多列计算生成新的列实现示例
Feb 24 Python
Python生成九宫格图片的示例代码
Apr 14 Python
django 认证类配置实现
Nov 11 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
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
Zend Framework数据库操作技巧总结
2017/02/18 PHP
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
2013/10/29 Javascript
Javascript实现颜色rgb与16进制转换的方法
2015/04/18 Javascript
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
在JavaScript中对HTML进行反转义详解
2016/05/18 Javascript
从重置input file标签中看jQuery的 .val() 和 .attr(“value”) 区别
2016/06/12 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
JS身份证信息验证正则表达式
2017/06/12 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
JavaScript 中Date对象的格式化代码方法汇总
2017/09/06 Javascript
Vue-cli中为单独页面设置背景色的实现方法
2018/02/11 Javascript
react中使用css的7中方式(最全总结)
2019/02/11 Javascript
利用vue重构有赞商城的思路以及总结整理
2019/02/21 Javascript
JavaScript解析JSON数据示例
2019/07/16 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
python fabric实现远程部署
2017/01/05 Python
Python机器学习之决策树算法
2017/12/22 Python
用Python逐行分析文件方法
2019/01/28 Python
Django REST Framework 分页(Pagination)详解
2020/11/30 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
Html5基于canvas实现电子签名并生成PDF文档
2020/12/07 HTML / CSS
千禧酒店及度假村官方网站:Millennium Hotels and Resorts
2019/05/10 全球购物
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
综合测评自我鉴定
2013/10/08 职场文书
探亲邀请信范文
2014/01/30 职场文书
音乐教师个人总结
2015/02/06 职场文书
门卫岗位职责
2015/02/09 职场文书
2015年父亲节寄语
2015/03/23 职场文书
刑事法律意见书
2015/06/04 职场文书
财务会计个人原因辞职信
2019/06/21 职场文书