python 消息队列风机选型设计实用手册什么实用

& & snakeMQ是一个跨平台的Python消息队列库。消息队列让不同主机间通信变得简单可靠。使用snakeMQ,只需要发送消息,剩下的事都交给snakeMQ处理。特色:纯python实现,跨平台自动重连接可靠发送--可配置的消息方式与消息超时方式持久化/临时 两种队列支持异步 -- poll()symmetrical -- 单个TCP连接可用于双工通讯多数据库支持 -- SQLite、MongoDB……brokerless - 类似ZeroMQ的实现原理扩展模块:RPC, bandwidth throttling& & 与AMQP, ZeroMQ等其他消息系统不兼容。& & 项目主页:http://www./lib/view/home/9
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
论文写作技巧
上一篇:下一篇:
相关经验教程138348人阅读
消息队列(4)
分布式(15)
目前业界有很多MQ产品,我们作如下对比:
是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。同时实现了一个经纪人(Broker)构架,这意味着消息在发送给客户端时先在中心队列排队。对路由(Routing),负载均衡(Load balance)或者数据持久化都有很好的支持。
是一个Key-Value的NoSQL数据库,开发维护很活跃,虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。实验表明:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。
号称最快的消息队列系统,尤其针对大吞吐量的需求场景。ZMQ能够实现RabbitMQ不擅长的高级/复杂的队列,但是开发人员需要自己组合多种技术框架,技术上的复杂度是对这MQ能够应用成功的挑战。ZeroMQ具有一个独特的非中间件的模式,你不需要安装和运行一个消息服务器或中间件,因为你的应用程序将扮演了这个服务角色。你只需要简单的引用ZeroMQ程序库,可以使用NuGet安装,然后你就可以愉快的在应用程序之间发送消息了。但是ZeroMQ仅提供非持久性的队列,也就是说如果down机,数据将会丢失。其中,Twitter的Storm中使用ZeroMQ作为数据流的传输。
是Apache下的一个子项目。 类似于ZeroMQ,它能够以代理人和点对点的技术实现队列。同时类似于RabbitMQ,它少量代码就可以高效地实现高级应用场景。RabbitMQ、ZeroMQ、ActiveMQ均支持常用的多种语言客户端 C++、Java、.Net,、Python、 Php、 Ruby等。
Jafka/Kafka
Kafka是Apache下的一个子项目,是一个高性能跨语言分布式Publish/Subscribe消息队列系统,而Jafka是在Kafka之上孵化而来的,即Kafka的一个升级版。具有以下特性:快速持久化,可以在O(1)的系统开销下进行消息持久化;高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现复杂均衡;支持Hadoop数据并行加载,对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka通过Hadoop的并行加载机制来统一了在线和离线的消息处理,这一点也是本课题所研究系统所看重的。Apache
Kafka相对于ActiveMQ是一个非常轻量级的消息系统,除了性能非常好之外,还是一个工作良好的分布式系统。
其他一些队列列表HornetQ、Apache Qpid、Sparrow、Starling、Kestrel、Beanstalkd、Amazon SQS就不再一一分析。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:243748次
积分:1679
积分:1679
排名:第18479名
原创:34篇
转载:15篇
评论:29条
(1)(1)(1)(9)(31)(7)(1)(2)python常用模块,很强大,很犀利
python常用库(官网:http://docs.python.org/release/2.5.2/lib/lib.html)
import os // 与操作系统相关的函数:如目录,文件,系统操作system,fork,exec族等等
import sys // 一些系统参数和常见处理函数
import subprocess // 替换os的一些老的开发函数如管道
import multiprocessing // 进程间通信,如进程,消息队列,共享内存
import threading // 线程间通信,如线程,线程队列,线程锁
import thread // 线程间通信另一种创建方式库
import Queue // 消息队列
import time // 时间操作的函数
import signal // 信号处理函数,如signal
import socket //
socket通信函数,如socket,accept,gethostname,connect,listen,connect等等
import urllib
import praselib
import smtplib
import xmllib
import telnetlib
...........................
python编译成的二进制跨平台文件,低版本不能加载高版本的该文件,方法:import py_compile
pile("dirpath")或python -m py_compile *.py
存在一个compileall库
python优化编译成的二进制跨平台文件,低版本不能加载高版本,方法:python -O -m py_compile
.pyd &python的动态链接库
/bbs/thread--6.html
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Python中线程的MQ消息队列实现以及消息队列的优点解析
作者:bravezhe
字体:[ ] 类型:转载 时间:
消息队列(MQ,Message Queue)在消息数据传输中的保存作用为数据通信提供了保障和实时处理上的便利,这里我们就来看一下Python中线程的MQ消息队列实现以及消息队列的优点解析
“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。相信对任何架构或应用来说,消息队列都是一个至关重要的组件,下面是十个理由:
Python的消息队列示例:
1.threading+Queue实现线程队列
#!/usr/bin/env python
import Queue
import threading
import time
queue = Queue.Queue()
class ThreadNum(threading.Thread):
"""没打印一个数字等待1秒,并发打印10个数字需要多少秒?"""
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
whileTrue:
#消费者端,从队列中获取num
num = self.queue.get()
print"i'm num %s"%(num)
time.sleep(1)
#在完成这项工作之后,使用 queue.task_done() 函数向任务已经完成的队列发送一个信号
self.queue.task_done()
start = time.time()
def main():
#产生一个 threads pool, 并把消息传递给thread函数进行处理,这里开启10个并发
for i in range(10):
t = ThreadNum(queue)
t.setDaemon(True)
#往队列中填错数据
for num in range(10):
queue.put(num)
#wait on the queue until everything has been processed
queue.join()
print"Elapsed Time: %s" % (time.time() - start)
运行结果:
Elapsed Time: 1.
具体工作步骤描述如下:
1,创建一个 Queue.Queue() 的实例,然后使用数据对它进行填充。
2,将经过填充数据的实例传递给线程类,后者是通过继承 threading.Thread 的方式创建的。
3,生成守护线程池。
4,每次从队列中取出一个项目,并使用该线程中的数据和 run 方法以执行相应的工作。
5,在完成这项工作之后,使用 queue.task_done() 函数向任务已经完成的队列发送一个信号。
6,对队列执行 join 操作,实际上意味着等到队列为空,再退出主程序。
在使用这个模式时需要注意一点:通过将守护线程设置为 true,程序运行完自动退出。好处是在退出之前,可以对队列执行 join 操作、或者等到队列为空。
2.多个队列
所谓多个队列,一个队列的输出可以作为另一个队列的输入!
#!/usr/bin/env python
import Queue
import threading
import time
queue = Queue.Queue()
out_queue = Queue.Queue()
class ThreadNum(threading.Thread):
"""bkeep"""
def __init__(self, queue, out_queue):
threading.Thread.__init__(self)
self.queue = queue
self.out_queue = out_queue
def run(self):
whileTrue:
#从队列中取消息
num = self.queue.get()
bkeep = num
#将bkeep放入队列中
self.out_queue.put(bkeep)
#signals to queue job is done
self.queue.task_done()
class PrintLove(threading.Thread):
"""Threaded Url Grab"""
def __init__(self, out_queue):
threading.Thread.__init__(self)
self.out_queue = out_queue
def run(self):
whileTrue:
#从队列中获取消息并赋值给bkeep
bkeep = self.out_queue.get()
keke = "I love " + str(bkeep)
print keke,
print self.getName()
time.sleep(1)
#signals to queue job is done
self.out_queue.task_done()
start = time.time()
def main():
#populate queue with data
for num in range(10):
queue.put(num)
#spawn a pool of threads, and pass them queue instance
for i in range(5):
t = ThreadNum(queue, out_queue)
t.setDaemon(True)
for i in range(5):
pl = PrintLove(out_queue)
pl.setDaemon(True)
pl.start()
#wait on the queue until everything has been processed
queue.join()
out_queue.join()
print"Elapsed Time: %s" % (time.time() - start)
运行结果:
I love 0 Thread-6
I love 1 Thread-7
I love 2 Thread-8
I love 3 Thread-9
I love 4 Thread-10
I love 5 Thread-7
I love 6 Thread-6
I love 7 Thread-9
I love 8 Thread-8
I love 9 Thread-10
Elapsed Time: 2.
ThreadNum 类工作流程
定义队列---&继承threading----&初始化queue----&定义run函数---&get queue中的数据----&处理数据----&put数据到另外一个queue--&发信号告诉queue该条处理完毕
main函数工作流程:
---&往自定义queue中扔数据
---&for循环确定启动的线程数----&实例化ThreadNum类----&启动线程并设置守护
---&for循环确定启动的线程数----&实例化PrintLove类---&启动线程并设置为守护
---&等待queue中的消息处理完毕后执行join。即退出主程序。
了解了MQ的大概实现以后,我们来总结一下消息队列的优点:
在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。消息队列在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
有时在处理数据的时候处理过程会失败。除非数据被持久化,否则将永远丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。在被许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理过程明确的指出该消息已经被处理完毕,确保你的数据被安全的保存直到你使用完毕。
因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的;只要另外增加处理过程即可。不需要改变代码、不需要调节参数。扩展就像调大电力按钮一样简单。
4. 灵活性 & 峰值处理能力
当你的应用上了Hacker News的首页,你将发现访问流量攀升到一个不同寻常的水平。在访问量剧增的情况下,你的应用仍然需要继续发挥作用,但是这样的突发流量并不常见;如果为 以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住增长的访问压力,而不是因为超出负荷的请求而完全崩溃。 请查看我们关于峰值处理能力的博客文章了解更多此方面的信息。
5. 可恢复性
当体系的一部分组件失效,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。而这种允许重试或者延后处理请求的能力通常是造就一个略感不便的用户和一个沮丧透顶的用户之间的区别。
6. 送达保证
消息队列提供的冗余机制保证了消息能被实际的处理,只要一个进程读取了该队列即可。在此基础上,IronMQ提供了一个"只送达一次"保证。无论有多少进 程在从队列中领取数据,每一个消息只能被处理一次。这之所以成为可能,是因为获取一个消息只是"预定"了这个消息,暂时把它移出了队列。除非客户端明确的 表示已经处理完了这个消息,否则这个消息会被放回队列中去,在一段可配置的时间之后可再次被处理。
7.排序保证
在许多情况下,数据处理的顺序都很重要。消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。IronMO保证消息浆糊通过FIFO(先进先出)的顺序来处理,因此消息在队列中的位置就是从队列中检索他们的位置。
在任何重要的系统中,都会有需要不同的处理时间的元素。例如,加载一张图片比应用过滤器花费更少的时间。消息队列通过一个缓冲层来帮助任务最高效率的执行--写入队列的处理会尽可能的快速,而不受从队列读的预备处理的约束。该缓冲有助于控制和优化数据流经过系统的速度。
9. 理解数据流
在一个分布式系统里,要得到一个关于用户操作会用多长时间及其原因的总体印象,是个巨大的挑战。消息系列通过消息被处理的频率,来方便的辅助确定那些表现不佳的处理过程或领域,这些地方的数据流都不够优化。
10. 异步通信
很多时候,你不想也不需要立即处理消息。消息队列提供了异步处理机制,允许你把一个消息放入队列,但并不立即处理它。你想向队列中放入多少消息就放多少,然后在你乐意的时候再去处理它们。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 通风机选型实用手册 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信