python基础 信号量 semaphore evevt 线程queue 生产者消费者模型

线程锁相当于同时只能有一个线程申请锁,有的场景无数据修改互斥要求可以同时让多个线程同时运行,且需要限制并发线程数量时可以使用信号量
 1 import threading, time, queue
 2
 3 def test(name):
 4     semaphore.acquire() #获取信号量锁
 5     print(‘my name is %s‘ %name)
 6     time.sleep(1)
 7     semaphore.release() #释放信号量锁
 8
 9 semaphore = threading.BoundedSemaphore(5) #创建一个信号量同时可以运行3个线程
10 for i in range(20):
11     t = threading.Thread(target=test, args=(i,))
12     t.start()
13 while threading.active_count() == 1:
14     print("all run done")

两个或者多个线程需要交互时,且一个进程需要根据另一线程状态执行对应操作时,可以通过event来设置线程状态达到期望的效果,下面是一个红绿灯的例子

 1 event = threading.Event() #实例化一个event
 2 def light():
 3     while True:
 4         print("红灯亮了,请停车")
 5         time.sleep(20) #开始是红灯20s
 6         event.set() #红灯时间到了,设置标志位
 7         print("绿灯亮了,请通行")
 8         time.sleep(30) #持续30s红灯
 9         event.clear() #清空标志位
10
11 def car(num):
12     while True:
13         if event.is_set():#检测event被设置则执行
14             print("car %s run"%num)
15             time.sleep(5)
16         else:
17             print("this is red light waiting")
18             event.wait() #此处会卡主,直到状态被设置才会向下执行
19
20
21
22 Light = threading.Thread(target=light,)
23 Light.start()
24 for i in range(10):
25     Car = threading.Thread(target=car, args=(i,))
26     Car.start()

当多个线程需要交互数据可以使用queue来进行数据传递,下面是经典的生产者消费者多线程模型示例,其中包含线程queue的基本使用方法

 1 my_queue = queue.Queue() #实例化一个队列
 2 queue1 = queue.LifoQueue() #后进 先出队列
 3 queue2 = queue.PriorityQueue() #带优先级的队列
 4 def pro():
 5     for i in range(100):
 6         my_queue.put(i) #队列里面放数据
 7 def con():
 8     while my_queue.qsize() > 0: #当队列有数据时候从队列取数据
 9         print("i an a consumer,get num %s"%my_queue.get(timeout=3))
10         time.sleep(2)
11     else:
12         print("my queue is empty")
13
14 Pro = threading.Thread(target=pro)
15 Pro.start()
16
17
18 for j in range(10):
19     Con = threading.Thread(target=con)
20     Con.start()



原文地址:https://www.cnblogs.com/flags-blog/p/12514561.html

时间: 2024-11-11 16:18:40

python基础 信号量 semaphore evevt 线程queue 生产者消费者模型的相关文章

Python 再次改进版通过队列实现一个生产者消费者模型

import time from multiprocessing import Process,Queue #生产者 def producer(q): for i in range(10): time.sleep(0.2) s = '大包子%s号'%i print(s+'新鲜出炉,拿去用') q.put(s) q.put(None) #发送一个任务结束信号,来中断消费者的程序 def consumer(q): while 1: time.sleep(0.5) baozi = q.get() if

queue队列,以及生产者消费者模型

queue 队列!特点是有序的,跟list的区别,list调用元素,其实就是复制,还要用remove给删掉,麻烦,queue更加方便 生成队列的方法: class queue.Queue(maxsize=0) #先入先出  #maxsize可以设定队列大小 class queue.LifoQueue(maxsize=0) #last in fisrt out  后进先出,例如卖东西,大家都喜欢新鲜的 class queue.PriorityQueue(maxsize=0) #存储数据时可设置优先

多线程、生产者消费者模型

目录 生产者消费者模型 生产者消费者模型 为什么要使用生产者和消费者模式 什么是生产者消费者模式 基于队列实现生产者消费者模型 多线程 什么是线程 开启线程的两种方式 线程与进程区别 Tread类的常用属性 守护线程 线程锁 生产者消费者模型 生产者消费者模型 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程.在多

进程 >> 互斥锁、队列与管道、生产者消费者模型

目录 1.互斥锁 2.队列与管道 3.生产者消费者模型(Queue) 4.生产者消费者模型(JoinableQueue) 1.互斥锁 首先导入Lock模块 实例化一把锁 但是每次生成子进程的时候都会重新实例化一把锁,我们的目的是想让所有的子进程使用同一把锁,所以需要把锁传递给子进程在使用 锁名.acquire():开锁->所有子进程开始抢位置 锁名.release():关锁->位置排好了,开始执锁起来执行. join与互斥锁的区别:join是把所有的子进程代码变为串行的,而互斥锁则可以规定那几

13 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件  queue队列 生产者消费者模型 Queue队列 开发一个线程池

本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把

进击的Python【第九章】:paramiko模块、线程与进程、各种线程锁、queue队列、生产者消费者模型

一.paramiko模块 他是什么东西? paramiko模块是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 先来个实例: 1 import paramiko 2 # 创建SSH对象 3 ssh = paramiko.SSHClient() 4 5 # 允许连接不在know_hosts文件中的主机 6 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 7 # 连接服务器 8 ss

Python学习笔记——进阶篇【第九周】———线程、进程、协程篇(队列Queue和生产者消费者模型)

Python之路,进程.线程.协程篇 本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 参考链接http://www.cnblogs.com/alex3714/articles/5230609.html

Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型

一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例子 #并发运行,效率高,但竞争同一打印终端,带来了打印错乱 from multiprocessing import Process import os,time def work(): print('%s is running' %os.getpid()) time.sleep(2) print('

python GIL锁 锁 线程池 生产者消费模型

python的GIL 锁 python内置的一个全局解释器锁 , 锁的作用就是保证同一时刻一个进程中只有一个线程可以被cpu调度 为什么有这把GIL锁? python语言的创始人在开发这门语言时 , 目的快速把语言开发出来 , 如果加上GIL锁(C语言加锁) , 切换时按照100条字节指令来进行线程间的切换 锁 : 1.锁 : Lock(1次放1个) 线程安全 , 多线程操作时 , 内部会让所有线程排队处理 , 如 : list / dict / Queue 线程不安全 + 人  =>排队处理