python 之多线程编程(四)

生产者与消费者问题

我们采用模块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

由上面的代码可以看出来生产者和消费者并不是一定轮流执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值