Python使用Queue对象实现多线程同步小案例

queue模块的Queue对象实现了多生产者/多消费者队列,尤其适合需要在多个线程之间进行信息交换的场合,实现了多线程编程所需要的所有锁语义。

Queue对象主要实现了put()和get()方法,分别用来往队列尾部追加元素和在队列头部获取并删除元素。这两个方法都允许指定超时时间,其用法分别为put(item, block=True, timeout=None)和get(block=True, timeout=None)

在下面的代码中,自定义了生产者线程类和消费者线程类,生产者生产随机数量个元素并放置到队列中,消费者则从队列中依次获取其中的元素。

from threading import Thread

from time import sleep

from queue import Queue

from random import randrange

class Producer(Thread):

'''自定义生产者线程类'''

def __init__(self, threadname):

Thread.__init__(self,\

name=threadname)

def run(self):

'''线程运行代码'''

total = randrange(20)

for i in range(total):

# 等待随机时间后往队列中放入一个元素

sleep(randrange(3))

myQueue.put(i)

print(self.getName(),\

' put ', i,\

' to queue.')

# None表示生产者线程结束

myQueue.put(None)

class Consumer(Thread):

def __init__(self, threadname):

Thread.__init__(self,\

name=threadname)

def run(self):

while True:

sleep(randrange(3))

item = myQueue.get()

if item is None:

break

print(self.getName(),\

' get ', item,\

' from queue.')

# 创建队列

myQueue = Queue()

# 创建并启动生产者和消费者线程

Producer('Producer').start()

Consumer('Consumer').start()

第一次运行结果:

Producer put 0 to queue.

Producer put 1 to queue.

Producer put 2 to queue.

Producer put 3 to queue.

Producer put 4 to queue.

Consumer get 0 from queue.

Producer put 5 to queue.

Consumer get 1 from queue.

Consumer get 2 from queue.

Producer put 6 to queue.

Producer put 7 to queue.

Consumer get 3 from queue.

Consumer get 4 from queue.

Consumer get 5 from queue.

Consumer get 6 from queue.

Consumer get 7 from queue.

第二次运行结果:

Producer put 0 to queue.

Consumer get 0 from queue.

Producer put 1 to queue.

Consumer get 1 from queue.

Producer put 2 to queue.

Consumer get 2 from queue.

Producer put 3 to queue.

Consumer get 3 from queue.

Producer put 4 to queue.

Producer put 5 to queue.

Consumer get 4 from queue.

Consumer get 5 from queue.

Producer put 6 to queue.

Consumer get 6 from queue.

Producer put 7 to queue.

Consumer get 7 from queue.

Producer put 8 to queue.

Producer put 9 to queue.

Consumer get 8 from queue.

Consumer get 9 from queue.

Producer put 10 to queue.

Consumer get 10 from queue.

Producer put 11 to queue.

Consumer get 11 from queue.

原文发布于微信公众号 - Python小屋(Python_xiaowu)

原文发表时间:2017-05-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大前端_Web

easyUI组件datagrid的二次封装

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

2803
来自专栏码匠的流水账

open-messaging使用实例

openmessaging-java/openmessaging-api-samples/src/main/java/io/openmessaging/samp...

1451
来自专栏码匠的流水账

TransferQueue实例

TransferQueue(java7引入)继承了BlockingQueue(BlockingQueue又继承了Queue)并扩展了一些新方法。生产者会一直阻塞...

1042
来自专栏JavaQ

深入理解Spring系列之一:开篇

Spring经过大神们的构思、编码,日积月累而来,所以,对其代码的理解也不是一朝一夕就能快速完成的。源码学习是枯燥的,需要坚持!坚持!坚持!当然也需要技巧,第一...

3859
来自专栏行者悟空

利用动态代理&反射&socket实现简单的RPC通信

3283
来自专栏Ryan Miao

mongodb-基础-update-remove

1.一些操作 collection重命名: > db.post.renameCollection('foo') { "ok" : 1 } > show coll...

2847
来自专栏听雨堂

C#实现微信AES-128-CBC加密数据的解密

小程序登录时,获得用户的信息,只是昵称,无法用作ID。而有用的数据,都加密着,腾讯给出了解密的方法: 加密数据解密算法 接口如果涉及敏感数据(如wx.getUs...

4759
来自专栏刘望舒

LeakCanary看这一篇文章就够了

LeakCanary是Square公司基于MAT开源的一个内存泄漏检测工具,在发生内存泄漏的时候LeakCanary会自动显示泄漏信息。

2.3K5
来自专栏Java成神之路

Java微信公众平台开发_07_JSSDK图片上传

(2)对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式 (即 key1=value1&key2=value2…)拼接成...

3821
来自专栏java 成神之路

Spring 多线程下注入bean问题

3635

扫码关注云+社区

领取腾讯云代金券