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 相关文章推荐
haskell实现多线程服务器实例代码
Nov 26 Python
python解析文件示例
Jan 23 Python
Queue 实现生产者消费者模型(实例讲解)
Nov 13 Python
Python中turtle作图示例
Nov 15 Python
Python爬虫信息输入及页面的切换方法
May 11 Python
pygame游戏之旅 如何制作游戏障碍
Nov 20 Python
python函数参数(必须参数、可变参数、关键字参数)
Aug 16 Python
python中几种自动微分库解析
Aug 29 Python
使用pyinstaller逆向.pyc文件
Dec 20 Python
vue常用指令代码实例总结
Mar 16 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
Pandas数据类型之category的用法
Jun 28 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输出缓存(output_buffering)的深入理解
2013/06/13 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
javascript 硬盘序列号+其它硬件信息
2008/12/23 Javascript
jQuery 扩展对input的一些操作方法
2009/10/30 Javascript
javascript window.confirm确认 取消对话框实现代码小结
2012/10/21 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
JavaScript实现为指定对象添加多个事件处理程序的方法
2015/04/17 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
2016/11/07 Javascript
Vue.js实现一个todo-list的上移下移删除功能
2017/06/26 Javascript
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
React中使用Vditor自定义图片详解
2020/12/25 Javascript
Python设计模式之观察者模式简单示例
2018/01/10 Python
Python基于递归实现电话号码映射功能示例
2018/04/13 Python
python 通过logging写入日志到文件和控制台的实例
2018/04/28 Python
Python给定一个句子倒序输出单词以及字母的方法
2018/12/20 Python
python配置grpc环境
2019/01/01 Python
pycharm创建一个python包方法图解
2019/04/10 Python
python 将字符串中的数字相加求和的实现
2019/07/18 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
2019/09/29 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
使用NumPy读取MNIST数据的实现代码示例
2019/11/20 Python
Python有参函数使用代码实例
2020/01/06 Python
python中format函数如何使用
2020/06/22 Python
Python turtle库的画笔控制说明
2020/06/28 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
计算机应届毕业生自荐信范文
2014/02/23 职场文书
协议书格式
2014/04/23 职场文书
环保倡议书格式范文
2014/05/14 职场文书
2014年文员工作总结
2014/11/18 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL
win10电脑右下角输入法图标不见了?Win10右下角不显示输入法的解决方法
2022/07/23 数码科技