生产者与消费者问题
我们采用模块queue来实现线程间通讯,让各个线程之间贡献数据。引入queue中的Queue(python3.X和python2.X中对queue模块的写法不同,python2.X中直接import Queue即可)
Queue 对象函数:
函数 | 描述 |
---|---|
qsize() | 返回队列大小 |
empty() | 如果队列为空返回True,否则返回False |
full() | 如果队列已满返回True,否则赶回False |
put(item, block=True, timeout=None) | 把item放到队列 |
get(block=True, timeout = None) | 从队列中取一个对象 |
from random import randint
from time import sleep
from queue import Queue
from myThread import MyThread
def writeQ(queue):
print('生产者模块')
queue.put(1)
print('size now', queue.qsize())
def readQ(queue):
val = queue.get(1)
print('消费者模块,size now',queue.qsize())
def producer(queue, loops):
for i in range(loops):
writeQ(queue)
sleep(randint(1, 3))
def coustomer(queue, loops):
for i in range(loops):
readQ(queue)
sleep(randint(2,3))
funcs = [producer, coustomer]
nfuncs = range(len(funcs))
def main():
#使用randint进行随机的生产和消耗
nloops = randint(2,5)
#创建一个大小为32的队列
q = Queue(32)
thread = []
for i in nfuncs:
t = MyThread(funcs[i], (q, nloops), funcs[i].__name__)
thread.append(t)
for i in nfuncs:
thread[i].start()
for i in nfuncs:
thread[i].join()
print('All Done')
if __name__ == '__main__':
main()
运行结果
producer 开始于 Wed Oct 9 14:44:22 2019
生产者模块
size now 1
coustomer 开始于 Wed Oct 9 14:44:22 2019
消费者模块,size now 0
生产者模块
size now 1
生产者模块
size now 2
消费者模块,size now 1
生产者模块
size now 2
消费者模块,size now 1
producer 结束于 Wed Oct 9 14:44:29 2019
消费者模块,size now 0
coustomer 结束于 Wed Oct 9 14:44:32 2019
All Done
由上面的代码可以看出来生产者和消费者并不是一定轮流执行。