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 '''
FIFO
 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个任务是异步执行的.
posted @ 2018-10-30 10:51  qi.hu  阅读(206)  评论(0编辑  收藏  举报