【并发编程】队列/进程间通信/线程
并发编程(二) »>思维导图****> »博客园**** 队列 队列:先进先出 堆栈:先进后出 q = Queue(5) 括号内可以传参数:表示的是这个队列的最大存储数 q.put(1) 括号内可以传参数:表示往队列中添加数据,当对列满了,程序会阻塞,直到有人从队列中取走值 q.get():表示向队列取值,当取完后再次获取,程序会阻塞,直到有人往队列存入值 q.full():判断对列是否满了 q.empty():判断队列中的数据是否取完 q.get_nowait():取值,没有值不等待直接报错 full,get_nowait,empty都不适用与多进程的情况 其他方法 q.qsize() 返回队列中目前项目的正确数量。此函数的结果并不可靠,因为在返回结果和在稍后程序中使用结果之间,队列中可能添加或删除了项目。在某些系统上,此方法可能引发NotImplementedError异常。 q.close() 关闭队列,防止队列中加入更多数据。调用此方法时,后台线程将继续写入那些已入队列但尚未写入的数据,但将在此方法完成时马上关闭。如果q被垃圾收集,将自动调用此方法。关闭队列不会在队列使用者中生成任何类型的数据结束信号或异常。例如,如果某个使用者正被阻塞在get()操作上,关闭生产者中的队列不会导致get()方法返回错误。 q.cancel_join_thread() 不会再进程退出时自动连接后台线程。这可以防止join_thread()方法阻塞。 q.join_thread() 连接队列的后台线程。此方法用于在调用q.close()方法后,等待所有队列项被消耗。默认情况下,此方法由不是q的原始创建者的所有进程调用。调用q.cancel_join_thread()方法可以禁止这种行为。 进程间的通信IPC机制 子进程放数据,主进程获取数据 两个子进程相互放,取数据 from multiprocessing import Process,Queue def producer(q): q.put('hello GF~') def consumer(q): print(q.get()) if __name__ == '__main__': q = Queue() p = Process(target=producer,args=(q,)) c = Process(target=consumer, args=(q,)) p.start() c.start() 生产者消费者模型 生产者:生产/制造数据的 消费者:消费/处理数据的 例子:做包子的,买包子的 # 1.做包子远比买包子的多 # 2.做包子的远比包子的少 # 供需不平衡的问题 from multiprocessing import Process,Queue,JoinableQueue import random import time def producer(name,food,q): for i in range(10): data = '%s生产了%s%s'%(name,food,i) time.sleep(random.random()) q.put(data) print(data) def consumer(name,q): while True: data = q.get() if data == None:break print('%s吃了%s'%(name,data)) time.sleep(random.random()) q.task_done() # 告诉队列你已经从队列中取出了一个数据 并且处理完毕了 if __name__ == '__main__': q = JoinableQueue() p = Process(target=producer,args=('大厨egon','馒头',q)) p1 = Process(target=producer,args=('跟班tank','生蚝',q)) c = Process(target=consumer,args=('许兆龙',q)) c1 = Process(target=consumer,args=('吃货jerry',q)) p.start() p1.start() c.daemon = True c1.daemon = True c.start() c1.start() p.join() p1.join() q.join() # 等到队列中数据全部取出 # q.put(None) # q.put(None) 线程 ...