Semaphore信号量
2018-06-17 23:40:58来源:未知 阅读 ()
一、前言
互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去。
二、semaphore
信号量semaphore,是一个变量,控制着对公共资源或者临界区的访问。信号量维护着一个计数器,指定可同时访问资源或者进入临界区的线程数。 每次有一个线程获得信号量时,计数器-1。若计数器为0,其他线程就停止访问信号量,直到另一个线程释放信号量。每当调用acquire()时,内置计数器-1 每当调用release()时,内置计数器+1。
# -*- coding: UTF-8 -*- import threading import time class MyThread(threading.Thread): def run(self): global num semaphore.acquire() # 获取信号锁 lock.acquire() num += 1 print('run the thread: %s\n' % self.name) print('now the number is ', num) lock.release() time.sleep(1) semaphore.release() # 释放信号锁 num = 0 lock = threading.Lock() # 最多允许5个线程同时运行 semaphore = threading.BoundedSemaphore(5) if __name__ == '__main__': for i in range(17): t = MyThread() t.start() while threading.active_count() != 1: pass else: print('--all threads done---') print(num)
注:
- 程序运行看上去是5个一组运行的,其实如果有个线程先完成了,释放了信号量,等待的线程就能获取信号量,但不超过5个。
- 多个线程同时运行,还是会有线程安全问题,所以对共享资源竞争还是要加锁
三、使用场景
- 连接池,线程池,MySQL的有连接池,同一时间有个并发,能连多少个连接。
- 我们为了保证我的socket_server,可以使用semaphore来限制同一时间内连接数。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:Event
- python内置装饰器@property 2019-07-24
- 文本备份云仓库-python实用脚本下载 2019-07-24
- Django中信号signals简单使用 2019-07-24
- python操作日志的封装 2019-05-23
- 面向对象之元类(metaclass) 2019-05-22
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash