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简单实现基于SSL的IRC bot实例
Jun 15 Python
python类的继承实例详解
Mar 30 Python
Python实现Linux的find命令实例分享
Jun 04 Python
Python创建对称矩阵的方法示例【基于numpy模块】
Oct 12 Python
python:print格式化输出到文件的实例
May 14 Python
详解flask入门模板引擎
Jul 18 Python
python从zip中删除指定后缀文件(推荐)
Dec 05 Python
PyCharm 2020.2 安装详细教程
Sep 25 Python
python 实现"神经衰弱"翻牌游戏
Nov 09 Python
python中添加模块导入路径的方法
Feb 03 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
Feb 25 Python
python 自动化偷懒的四个实用操作
Apr 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
zen_cart实现支付前生成订单的方法
2016/05/06 PHP
PHP模糊查询的实现方法(推荐)
2016/09/06 PHP
PHP批量删除jQuery操作
2017/07/23 PHP
基于JQuery的访问WebService的代码(可访问Java[Xfire])
2010/11/19 Javascript
Juqery Html(),append()等方法的Bug解决方法
2010/12/13 Javascript
使用javascript为网页增加夜间模式
2014/01/26 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
2015/10/15 Javascript
前端性能优化及技巧
2016/05/06 Javascript
JS中位置与大小的获取方法
2016/11/22 Javascript
Jquery-data的三种用法
2017/04/18 jQuery
JS滚动到指定位置导航栏固定顶部
2017/07/03 Javascript
js实现控制文件拖拽并获取拖拽内容功能
2018/02/17 Javascript
nodejs多版本管理总结
2018/04/03 NodeJs
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
VUE解决 v-html不能触发点击事件的问题
2019/10/28 Javascript
[53:23]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
简单学习Python time模块
2016/04/29 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
python中dict使用方法详解
2019/07/17 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
python已协程方式处理任务实现过程
2019/12/27 Python
python获取依赖包和安装依赖包教程
2020/02/13 Python
Russell Stover巧克力官方网站:美国领先的精美巧克力制造商
2016/11/27 全球购物
美国在线艺术商店:HandmadePiece
2020/11/06 全球购物
医学院学生求职简历的自我评价
2013/10/24 职场文书
光荣入党自我鉴定
2014/01/22 职场文书
致铅球运动员加油稿
2014/02/13 职场文书
车辆安全隐患排查制度
2015/08/05 职场文书
2016继续教育研修日志
2015/11/13 职场文书
《为人民服务》教学反思
2016/02/20 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android
nginx安装以及配置的详细过程记录
2021/09/15 Servers
Python获取指定日期是"星期几"的6种方法
2022/03/13 Python
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB