
摘录核心编程在这个例子当中, 进行生产者 - 消费者模型的演示: 商品或服务的生产者去生产商品, 随后把生产出来的商品放置到类似于队列的那种数据结构里面。生产商品时所花费的时间是无法确定的, 同样的道理, 消费者消费商品的时间也是不能确定的。借助queue模块在.x版本里, 称作Queue来给出线程间通信的机制, 进而使得线程之间能够分享数据。具体是这样, 先创建一个队列, 让生产者线程于其中放置新的商品, 然后消费者线程去消费这些商品。下表是queue模块的部分属性属性描述queue模块的类Queue(0)构建一个会按照先进入的元素先被取出顺序的队列。要是给定了最大值, 那么在队列不存在容纳空间的时候会处于阻塞状态反之不然, 即为没有上限的队列。(0)建造一个后面进入的先出来的队列, 要是给定了最大数值, 那么在队列不存在空间的时候进行阻塞, 要是没给定最大数值, 那么就是无限的序列。(0)创建一个具有优先级的队列, 要是给定了最大值, 那么在队列不存在空间的时候会阻塞, 不然的话, 就是无限序列。queue异常Empty当对空队列调用get*()方法时抛出异常Full当对已满的队列调用put*()方法时抛出异常queue对象方法qsize()让队列大小被返回, 因为在返回队列大小时, 它有可能会被其他线程进行修改, 所以这个值之为近似值。empty()如果队列为空则返回True否则返回Falsefull()如果队列已满则返回True否则返回Falseput(item,blockTrue,None)将物品放进队列之中。要是阻塞设置为真此为默认情形, 并且其值为无, 那么在可用空间出现以前是阻塞的状态若是其值为正, 那么最多阻塞相应的秒数要是阻塞设置为假, 进而会抛出为空异常。(item)和put(item,False)效果相同get(blockTrue,None)从队列那儿拿来元素嗯, 如果给出了那样不是0值的block, 那就一直处于阻塞状态直至有可被利用的元素到达为止。()和get(False)效果想用()作为用来表明队列里的某一个元素已经做完执行, 此方法会获取下面的join()采用。join()在队列中所有元素执行完毕并调用上面的()信号前保持阻塞。下面的.py脚本里, 运用queue对象达成了生产者 - 消费者场景, 它能够随机地进行商品生产或者消费, 并且生产者以及消费者是互相独立的, 以并发方式执行线程。留意, 此处运用了在之前章节里改写而成的类。#python 3.6fromrandomimportrandintfromtimeimportsleepfromqueueimportQueuefrommyThreadimportMyThread#将一个对象放入队列中defwriteQ(queue):print(正在为队列生产………) queue.put(商品,1)print(当前商品总数,queue.qsize())#消费队列中的一个对象defreadQ(queue): val queue.get(1)print(正在从队列中消费商品……消费后还剩余商品,queue.qsize())#模仿生产者。defwriter(queue,loops):foriinrange(loops): writeQ(queue) sleep(randint(1,3))#writer的睡眠时间一般比reader短是为了阻碍 reader从空队列中获取对象换句话说就是使得轮到reader执行时已存在可消费对象的可能性更大。#模仿消费者defreader(queue,loops):foriinrange(loops): readQ(queue) sleep(randint(2,5)) funcs[writer,reader] nfuncsrange(len(funcs))defmain(): nloops randint(2,5)#randint 和randrange类似区别在于randrange是半开半闭区间而randint是闭区间q Queue(32) threads []#模拟线程池foriinnfuncs: t MyThread(funcs[i],(q,nloops),funcs[i].__name__)#创建线程threads.append(t)foriinnfuncs: threads[i].start()#开始执行线程foriinnfuncs: threads[i].join()print(结束)if__name____main__: main()执行效果类似PS C:\Users\WC python E:\Python3.6.3\workspace\prodcons.py 开始执行 writer 在 Thu Apr 19 21:06:22 2018 正在为队列生产……… 开始执行 reader 在 Thu Apr 19 21:06:22 2018 当前商品总数 1 正在从队列中消费商品……消费后还剩余商品 0 正在为队列生产……… 当前商品总数 1 正在从队列中消费商品……消费后还剩余商品 0 正在为队列生产……… 当前商品总数 1 正在从队列中消费商品……消费后还剩余商品 0 正在为队列生产……… 当前商品总数 1 正在为队列生产……… 当前商品总数 2 writer 结束于 Thu Apr 19 21:06:30 2018 正在从队列中消费商品……消费后还剩余商品 1 正在从队列中消费商品……消费后还剩余商品 0 reader 结束于 Thu Apr 19 21:06:39 2018 结束