[ Python - 12 ] 线程的信号量、标志位及队列
线程的信号量
线程的信号量是同时允许一定数量的线程更改数据,主要作用在于限制线程的并发。
#!_*_coding:utf-8_*_
# Author: hkey
import threading, time
# 线程的信号量
sem = threading.BoundedSemaphore(5) # 实例化信号量并限制并发为5个线程
def run():
sem.acquire() # 开始
print('running...', threading.get_ident())
time.sleep(1)
sem.release() # 结束
if __name__ == '__main__':
for i in range(20):
t = threading.Thread(target=run)
t.start()
线程的标志位Events
python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法wait、clear、set
- 事件处理的机制:全局定义一个Flag. 使用threading.Event 实现线程间通信 event = threading.Event() 初始值为False
- 如果'Flag'值为False,那么当程序执行event.wait方法时就会阻塞
- 如果'Flag'值为True,那么event.wait方法便不在阻塞
- clear: 将'Flag'设置为False
- set:将'Flag'设置为True
一旦该线程通过wait()方法进入等待状态,直到另一个线程调用Event的set()方法将内置标志设置为True时,该Event会通知所有等待状态的线程恢复运行。
#!_*_coding:utf-8_*_
# Author: hkey
import threading, time
# 线程的标志位
# 红绿灯, 灯控制车辆
event = threading.Event() def light():
n = 0
while True:
if n <= 5:
event.set() # 设置为set, wait就不阻塞 绿灯状态
print('\33[42;1m green light \33[0m')
elif 5 < n < 10:
event.clear() # 将'Flag'设置为False 红灯状态
print('\33[41;1m red light \33[0m')
else:
n = 0
time.sleep(1)
n += 1 def car():
while True:
if event.is_set():
print('cars running...')
else:
print('cars stopped...')
event.wait() # 当使用clear方法将Flag为False,使用wait方法阻塞;当使用set方法将Flag设置为True,则恢复运行
time.sleep(1) t1 = threading.Thread(target=light)
t2 = threading.Thread(target=car)
t1.start()
t2.start()
线程的队列
线程的队列共有三种:
class queue.Queue(maxsize=0) #先入先出
class queue.LifoQueue(maxsize=0) # 先入后出
class queue.PriorityQueue(maxsize=0) #存储数据时可设置优先级的队列
这里主要使用先入先出模式
生产者消费者模型
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
#!_*_coding:utf-8_*_
# Author: hkey
import threading, queue, time
q = queue.Queue()
def product():
for i in range(10):
q.put('包子-%s' %i) # 循环put 10个包子
print('等待取包子')
q.join() # 阻塞等待队列被清空
print('所有包子都被取走了。') def consumer():
while not q.empty(): # empty()方法判断队列是否为空,空为True
print('吃掉%s' %q.get())
q.task_done() # 告知这个任务执行完了
time.sleep(1) t1 = threading.Thread(target=product)
t2 = threading.Thread(target=consumer)
t1.start()
t2.start()
[ Python - 12 ] 线程的信号量、标志位及队列的更多相关文章
- Java之【线程通信】--标志位练习
* 写两个线程,一个线程打印1-52,另一个线程答应字母A-Z. * 打印顺序为12A34B56C--5152Z.通过使用线程之间的通信协调关系. 注:分别给两个对象构造一个对象o,数字每打印两个或字 ...
- Java之【线程通信】--标志位练习2
定义一个线程A,输出1 - 10之间的整数,定义一个线程B,逆序输出1 - 10之间的整数,要求线程A和线程B交替输出 方法一:非标志位方法 package Homework; //1 定义一个线程A ...
- Python之线程 3 - 信号量、事件、线程队列与concurrent.futures模块
一 信号量 二 事件 三 条件Condition 四 定时器(了解) 五 线程队列 六 标准模块-concurrent.futures 基本方法 ThreadPoolExecutor的简单使用 Pro ...
- Python学习---线程锁/信号量/条件变量同步/线程池1221
线程锁 问题现象: 多线程情况下,CPU遇到阻塞会进行线程的切换,所以导致执行了tmp-=1的值还未赋值给num=tmp,另一个线程2又开始了tmp -=1,所以导致最后的值重复赋值给了num,所以出 ...
- Day12- Python基础12 线程、GIL、Lock锁、RLock锁、Semaphore锁、同步条件event
http://www.cnblogs.com/yuanchenqi/articles/6248025.html 博客地址 本节内容: 1:进程和线程的说明 2:线程的两种调用方式 3:threadi ...
- Python学习---线程/协程/进程学习 1220【all】
Python学习---线程基础学习 Python学习---线程锁/信号量/条件变量同步1221 Python学习---同步条件event/队列queue1223 Python学习---进程 1225 ...
- Python全栈开发-Day9-线程/GIL/事件/队列
本节内容 进程与线程的概念 Python threading 模块 GIL——global interpreter lock Mutex互斥锁(线程锁) Semaphore信号量 Events事件 Q ...
- python学习笔记12 ----线程、进程
进程和线程的概念 进程和线程是操作系统中两个很重要的概念,对于一般的程序,可能有若干个进程,每一个进程有若干个同时执行的线程.进程是资源管理的最小单位,线程是程序执行的最小单位(线程可共享同一进程里的 ...
- python正则表达式模块re:正则表达式常用字符、常用可选标志位、group与groups、match、search、sub、split,findall、compile、特殊字符转义
本文内容: 正则表达式常用字符. 常用可选标志位. group与groups. match. search. sub. split findall. compile 特殊字符转义 一些现实例子 首发时 ...
随机推荐
- Vue折腾记 - (2)写一个不大靠谱的面包屑组件
先看效果图 我把页面标题和面包屑封装到一起..就不用涉及到组件的通讯了,不然又要去监听路由或者依赖状态去获取 这里写图片描述 疑惑解答: 点击父(也就是折叠菜单)为什么会跑到子菜单第一个 因为我第一个 ...
- poj1789 Truck History最小生成树
Truck History Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 20768 Accepted: 8045 De ...
- onkeypress,onkeyup,onkeydown区别
onkeypress 这个事件在用户按下并放开任何字母数字键时发生.系统按钮(例如,箭头键和功能键)无法得到识别. onkeyup 这个事件在用户放开任何先前按下的键盘键时发生. onkeydown ...
- 【工作感悟】——揭开“PM”的面纱
[前言] 上次跟大家分享了面试的故事,小编觉得效果还不错,因此小编决定把工作感悟系列写下去,不过时间就不好说了.希望小伙伴们在评论列表中发表自己的看法和观点,积极参与啦~~ [背景] 初来Y公司,作为 ...
- Luogu3960 NOIP2017列队(splay/线段树)
令splay中的一个点表示一段区间,需要使用其中某个点时将区间分裂即可,剩下的都是splay的基本操作了.写的非常丑陋,注意细节.感觉考场上肯定只能靠部分分苟活了.想起来去年因为各种莫名其妙的原因50 ...
- 【南开OJ2264】节操大师(贪心+二分+并查集/平衡树)
好久没更新了,今天就随便写一个吧 题目内容 MK和他的小伙伴们(共n人,且保证n为2的正整数幂)想要比试一下谁更有节操,于是他们组织了一场节操淘汰赛.他们的比赛规则简单而暴力:两人的节操正面相撞,碎的 ...
- 遇到问题---java---myeclipse中maven项目引用另一个导致的resource文件混乱的问题
遇到情况 情况是这样的,我们在构建项目时,经常会把一些公用的类和配置提取出去,作为一个公共项目.然后把公共项目作为一个jar包构件引入我们当前的项目中. 引入方式是 <dependency> ...
- 【NOIP模拟赛】天神下凡 动态开点线段树
这些圆一定是在同一水平面上的,由于他们没有相交,因此我们发现他们每个人与外界关系可以分为,1.存在并圈圈 2.存在圈圈并被割,因此我们把所有的圆都加1,把被割的在加1,就可以啦,因此我们开一个线段树, ...
- ios10 safari浏览器 在touchmove 里面写e.preventDefault(); 不起作用 的解决方法
最近做手机端项目遇到一个问题,就是在ios10系统里面 safari浏览器 在touchmove 里面写e.preventDefault();不起作用 更种google 还是没有找到解决方法 最后找 ...
- Codeforces Round #526 (Div. 2) C. The Fair Nut and String
C. The Fair Nut and String 题目链接:https://codeforces.com/contest/1084/problem/C 题意: 给出一个字符串,找出都为a的子序列( ...