import threading,time li = [1,2,3,4,5,6] def pri(): while li: a = li[-1] print(a) time.sleep(1) li.remove(a) try: li.remove(a) except Exception as e: print(a,e) t1 = threading.Thread(target=pri,args=()) t1.start() t2 = threading.Thread(target=pri,args=()) t2.start()
先进先出
import queue #线程队列 2.7的时候q为大写 q = queue.Queue(3) #FIFO 默认 1先进先出 2先进后出 3后进先出 q.put(12) q.put('hello') q.put({'name':'aaron'}) q.put(123,False) #如果已满就不再加进去 while 1: data = q.get() #data = q.get(block = False) print(data) print('------------------')
先进后出
import queue #线程队列 2.7的时候q为大写 q = queue.LifoQueue() #FIFO 默认 1先进先出 2先进后出 3后进先出 q.put(12) q.put('hello') q.put({'name':'aaron'}) q.put(123,False) #如果已满就不再加进去 while 1: data = q.get() print(data) print('------------------') import queue #线程队列 2.7的时候q为大写 q = queue.LifoQueue() q.put(12) q.put('hello') q.put({'name':'aaron'}) q.put(123,False) #如果已满就不再加进去 print(q.qsize()) print(q.empty()) print(q.full()) print(q.task_done()) #在完成任务之后q.task_done函数向任务已经完成的队列发送一个信号 print(q.join())
生成消费者模型:通过一个容器来解决生产者和消费者的强耦合问题
import queue,threading,time,random q = queue.Queue() def Producter(name): count = 0 while count < 10: print('making..............') time.sleep(random.randrange(3)) q.put(count) print('Producter %s has producter %s baozi。。' %(name,count)) count += 1 print('ok........') def Consumer(name): count = 0 while count < 10: time.sleep(random.randrange(4)) if not q.empty(): data = q.get() print(data) print('\033[32;1mConsumer %s has eat %s baozi..\033[0m' %(name,count)) else: print('no baozi anymore') count += 1 p = threading.Thread(target=Producter,args=('A',)) c = threading.Thread(target=Consumer,args=('B',)) p.start() c.start()
存在问题版本
import queue,threading,time,random q = queue.Queue() def Producter(name): count = 0 while count < 10: print('making..............') time.sleep(random.randrange(3)) q.put(count) print('Producter %s has producter %s baozi。。' %(name,count)) count += 1 q.task_done() #q.join() print('ok........') def Consumer(name): count = 0 while count < 10: time.sleep(random.randrange(4)) if not q.empty(): data = q.get() #q.task_done() q.join() print('\033[32;1mConsumer %s has eat %s baozi..\033[0m' %(name,data)) else: print('no baozi anymore') count += 1 p = threading.Thread(target=Producter,args=('A',)) c1 = threading.Thread(target=Consumer,args=('B',)) c2 = threading.Thread(target=Consumer,args=('C',)) c3 = threading.Thread(target=Consumer,args=('D',)) p.start() c1.start() c2.start() c3.start()
解决问题版本
import queue,threading,time,random q = queue.Queue() def Producter(name): count = 0 while count < 10: print('making..............') time.sleep(5) q.put(count) print('Producter %s has producter %s baozi。。' %(name,count)) count += 1 q.task_done() #q.join() print('ok........') def Consumer(name): count = 0 while count < 10: time.sleep(random.randrange(4)) print('waiting...........') q.join() data = q.get() #q.task_done() print('\033[32;1mConsumer %s has eat %s baozi..\033[0m' %(name,data)) count += 1 p = threading.Thread(target=Producter,args=('A',)) c1 = threading.Thread(target=Consumer,args=('B',)) c2 = threading.Thread(target=Consumer,args=('C',)) c3 = threading.Thread(target=Consumer,args=('D',)) p.start() c1.start() c2.start() c3.start() import queue,threading,time,random q = queue.Queue() def Producter(name): count = 0 while count < 10: print('making..............') time.sleep(5) q.put(count) print('Producter %s has producter %s baozi。。' %(name,count)) count += 1 # q.task_done() q.join() print('ok........') def Consumer(name): count = 0 while count < 10: time.sleep(random.randrange(4)) # q.join() data = q.get() print('eating...........') time.sleep(4) q.task_done() print('\033[32;1mConsumer %s has eat %s baozi..\033[0m' %(name,data)) count += 1 p = threading.Thread(target=Producter,args=('A',)) c1 = threading.Thread(target=Consumer,args=('B',)) c2 = threading.Thread(target=Consumer,args=('C',)) c3 = threading.Thread(target=Consumer,args=('D',)) p.start() c1.start() c2.start() c3.start()