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简单获取自身外网IP的方法
Sep 18 Python
python生成二维码的实例详解
Oct 29 Python
python实现随机森林random forest的原理及方法
Dec 21 Python
python多行字符串拼接使用小括号的方法
Mar 19 Python
pycharm运行程序时在Python console窗口中运行的方法
Dec 03 Python
Python实现计算文件MD5和SHA1的方法示例
Jun 11 Python
Python OpenCV调用摄像头检测人脸并截图
Aug 20 Python
python协程gevent案例 爬取斗鱼图片过程解析
Aug 27 Python
django连接mysql数据库及建表操作实例详解
Dec 10 Python
Python中实现输入超时及如何通过变量获取变量名
Jan 18 Python
Anaconda+Pycharm环境下的PyTorch配置方法
Mar 13 Python
Pandas实现批量拆分与合并Excel的示例代码
May 30 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查看session内容的函数
2008/08/27 PHP
PHP 输出简单动态WAP页面
2009/06/09 PHP
深入php define()函数以及defined()函数的用法详解
2013/06/05 PHP
jQuery+php实现ajax文件即时上传的详解
2013/06/17 PHP
PHP检测用户是否关闭浏览器的方法
2016/02/14 PHP
ext form 表单提交数据的方法小结
2008/08/08 Javascript
12款经典的白富美型—jquery图片轮播插件—前端开发必备
2013/01/08 Javascript
jQuery客户端分页实例代码
2013/11/18 Javascript
JavaScript获取flash对象与网上的有所不同
2014/04/21 Javascript
node.js中的http.response.getHeader方法使用说明
2014/12/14 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
WebPack基础知识详解
2017/01/16 Javascript
微信小程序 引入es6 promise
2017/04/12 Javascript
js获取浏览器的各种属性
2017/04/27 Javascript
实例讲解javascript实现异步图片上传方法
2017/12/05 Javascript
javascript实现数字配对游戏的实例讲解
2017/12/14 Javascript
jQuery位置选择器用法实例分析
2019/06/28 jQuery
通过微信公众平台获取公众号文章的方法示例
2019/12/25 Javascript
Vue实现购物车基本功能
2020/11/08 Javascript
[01:24:09]Ti4 冒泡赛第二轮DK vs C9 1
2014/07/14 DOTA
python分布式环境下的限流器的示例
2017/10/26 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
Ubuntu18.04下python版本完美切换的解决方法
2019/06/14 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
2019/06/21 Python
python的re模块使用方法详解
2019/07/26 Python
Python使用pymysql模块操作mysql增删改查实例分析
2019/12/19 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
2020/02/25 Python
如何在python中执行另一个py文件
2020/04/30 Python
keras slice layer 层实现方式
2020/06/11 Python
电脑销售顾问自荐信
2014/01/29 职场文书
《每逢佳节倍思亲》教后反思
2014/04/19 职场文书
小学社团活动总结
2014/06/27 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
用python批量解压带密码的压缩包
2021/05/31 Python
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA
Vite + React从零开始搭建一个开源组件库
2022/06/25 Javascript