python线程信号量semaphore使用解析

作者:猿说python 时间:2023-02-08 08:47:24 

这篇文章主要介绍了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(),输出的时间全部都是一样的,这个问题比较简单,可以自己去实验一下!

来源:https://www.cnblogs.com/shuopython/p/11961542.html

标签:python,线程,信号量,semaphore
0
投稿

猜你喜欢

  • JS重载实现方法分析

    2023-10-07 08:09:04
  • Python django框架应用中实现获取访问者ip地址示例

    2022-01-06 08:08:20
  • ASP 多关键词查询实例代码

    2011-04-11 11:14:00
  • 掀起抛弃IE6的高潮吧

    2009-02-26 12:44:00
  • 盗亦有道 Web2.0网站优秀模仿者逐个数

    2007-09-11 19:46:00
  • Javascript:window对象出身何处

    2007-08-28 15:16:00
  • 关于JS中变量的显式声明和隐式声明

    2008-10-06 13:22:00
  • php根据isbn书号查询amazon网站上的图书信息的示例

    2023-11-15 03:08:53
  • AJAX概述

    2007-11-03 13:41:00
  • 一些建站常用简单html代码

    2008-06-01 13:17:00
  • Mootools 1.2教程(11)——Fx.Morph、Fx选项和Fx事件

    2008-12-04 16:03:00
  • 段正淳的css笔记(4)css代码的简写

    2007-11-01 22:03:00
  • python+requests接口压力测试500次,查看响应时间的实例

    2021-09-29 08:27:56
  • 如果没设置 DSN 也能建立数据库连接吗?

    2009-11-02 20:16:00
  • Python3实现将文件归档到zip文件及从zip文件中读取数据的方法

    2021-07-03 18:21:00
  • 抛砖引玉Web2.0设计指南

    2008-06-30 12:49:00
  • ADO的错误码对应的含义

    2007-10-22 17:31:00
  • Windows 8.1 64bit下搭建 Scrapy 0.22 环境

    2023-07-23 12:51:08
  • java-jsp springmvc-controller 传值到页面的方法

    2023-06-16 18:19:52
  • 国内ASP开源建站系统一览

    2009-07-10 13:21:00
  • asp之家 网络编程 m.aspxhome.com