51_并发编程-线程-队列
一、队列
这三种队列都是线程安全的,不会出现多个线程抢占同一个资源或数据的情况
1 import queue #不需要通过threading模块里面导入,直接import queue就可以了,这是python自带的
2 q=queue.Queue()
3 q.put('first')
4 q.put('second')
5 q.put('third')
6 # q.put_nowait() #没有数据就报错,可以通过try来搞
7 print(q.get())
8 print(q.get())
9 print(q.get())
10 # q.get_nowait() #没有数据就报错,可以通过try来搞
11 '''
12 结果(先进先出):
13 first
14 second
15 third
16 '''
1 import queue
2
3 q=queue.LifoQueue() #队列,类似于栈,栈我们提过吗,是不是先进后出的顺序啊
4 q.put('first')
5 q.put('second')
6 q.put('third')
7 # q.put_nowait()
8
9 print(q.get())
10 print(q.get())
11 print(q.get())
12 # q.get_nowait()
13 '''
14 结果(后进先出):
15 third
16 second
17 first
18 '''
1 import queue
2
3 q=queue.PriorityQueue()
4 #put进入一个元组,元组的第一个元素是优先级(通常是数字,也可以是非数字之间的比较),数字越小优先级越高
5 q.put((-10,'a'))
6 q.put((-5,'a')) #负数也可以
7 # q.put((20,'ws')) #如果两个值的优先级一样,那么按照后面的值的acsii码顺序来排序,如果字符串第一个数元素相同,比较第二个元素的acsii码顺序
8 # q.put((20,'wd'))
9 # q.put((20,{'a':11})) #TypeError: unorderable types: dict() < dict() 不能是字典
10 # q.put((20,('w',1))) #优先级相同的两个数据,他们后面的值必须是相同的数据类型才能比较,可以是元祖,也是通过元素的ascii码顺序来排序
11
12 q.put((20,'b'))
13 q.put((20,'a'))
14 q.put((0,'b'))
15 q.put((30,'c'))
16
17 print(q.get())
18 print(q.get())
19 print(q.get())
20 print(q.get())
21 print(q.get())
22 print(q.get())
23 '''
24 结果(数字越小优先级越高,优先级高的优先出队):
25 '''
二、信号量
信号量:控制同时能够进入锁内去执行代码的线程数量(进程数量),维护了一个计数器,刚开始创建信号量的时候假如设置的是4个房间,进入一次acquire就减1 ,出来一个就+1,如果计数器为0,那么其他的任务等待,这样其他的任务和正在执行的任务是一个同步的状态,而进入acquire里面去执行的那4个任务是异步执行的.