`
iyuan
  • 浏览: 471901 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

zeroMQ初体验-19.应答模式进阶(五)-异步式应答

    博客分类:
  • MQ
阅读更多
恩,这应该算是比较实用的部分了。

模式图:


import zmq
import threading
import time
from random import choice

class ClientTask(threading.Thread):
    """ClientTask"""
    def init(self):
        threading.Thread.init (self)

    def run(self):
        context = zmq.Context()
        socket = context.socket(zmq.XREQ)
        identity = 'worker-%d' % (choice([0,1,2,3,4,5,6,7,8,9]))
        socket.setsockopt(zmq.IDENTITY, identity )
        socket.connect('tcp://localhost:5570')
        print 'Client %s started' % (identity)
        poll = zmq.Poller()
        poll.register(socket, zmq.POLLIN)
        reqs = 0
        while True:
            for i in xrange(5):
                sockets = dict(poll.poll(1000))
                if socket in sockets:
                    if sockets[socket] == zmq.POLLIN:
                        msg = socket.recv()
                        print '%s: %s\n' % (identity, msg)
                        del msg
            reqs = reqs + 1
            print 'Req #%d sent..' % (reqs)
            socket.send('request #%d' % (reqs))

        socket.close()
        context.term()

class ServerTask(threading.Thread):
    """ServerTask"""
    def init(self):
        threading.Thread.init (self)

    def run(self):
        context = zmq.Context()
        frontend = context.socket(zmq.XREP)
        frontend.bind('tcp://*:5570')

        backend = context.socket(zmq.XREQ)
        backend.bind('inproc://backend')

        workers = []
        for i in xrange(5):
            worker = ServerWorker(context)
            worker.start()
            workers.append(worker)

        poll = zmq.Poller()
        poll.register(frontend, zmq.POLLIN)
        poll.register(backend,  zmq.POLLIN)

        while True:
            sockets = dict(poll.poll())
            if frontend in sockets:
                if sockets[frontend] == zmq.POLLIN:
                    msg = frontend.recv()
                    print 'Server received %s' % (msg)
                    backend.send(msg)
            if backend in sockets:
                if sockets[backend] == zmq.POLLIN:
                    msg = backend.recv()
                    frontend.send(msg)

        frontend.close()
        backend.close()
        context.term()
 
class ServerWorker(threading.Thread):
    """ServerWorker"""
    def init(self, context):
        threading.Thread.init (self)
        self.context = context

    def run(self):
        worker = self.context.socket(zmq.XREQ)
        worker.connect('inproc://backend')
        print 'Worker started'
        while True:
            msg = worker.recv()
            print 'Worker received %s' % (msg)
            replies = choice(xrange(5))
            for i in xrange(replies):
                time.sleep(1/choice(range(1,10)))
                worker.send(msg)
            del msg

        worker.close()

def main():
    """main function"""
    server = ServerTask()
    server.start()
    for i in xrange(3):
        client = ClientTask()
        client.start()
    
    server.join()
    

if name == "main":
    main()


作为一个异步的服务器,详图应该是这样的:


这里的数据传递顺序是这样的:
 client        server     frontend     worker
    [ XREQ ]<---->[ XREP <----> XREQ <----> XREQ ]
            1 part       2 parts     2 parts


在这里有可能碰到一个比较经典的c/s问题:
c端太多,耗尽s端资源怎么办?
这就需要靠谱些的机制了,比如通过“心跳”来确定是否应该释放这个c端的资源等。当然,那就是另外一个话题了。

(未完待续)
1
0
分享到:
评论
2 楼 iyuan 2012-02-06  
guozhiwei 写道
这个例子应该就是 官方提供的包里面的example包里面的Python中的asyncsrv.py

你这个例子有些地方跟它不一样,

你的例子 跑不起来 

而官方的例子能跑起来...

你的例子在send 和 recv的时没有identity,加上以后就能正常跑了.




就是直接拿的官网的例子。原来是声明了setsockopt就可以用的。也可能是zmq版本更新了导致的吧。zmq这块目前还没什么机会用到,有时间还得再捋下,初体验还是太浅了,哈哈
1 楼 guozhiwei 2012-02-06  
这个例子应该就是 官方提供的包里面的example包里面的Python中的asyncsrv.py

你这个例子有些地方跟它不一样,

你的例子 跑不起来 

而官方的例子能跑起来...

你的例子在send 和 recv的时没有identity,加上以后就能正常跑了.



相关推荐

    zeromq-4.3.4.tar.gz

    0MQ(也称为 ZeroMQ 或 ØMQ)是一个开源的消息中间件,它提供了一种轻量级、高性能的异步消息传递机制。这个“zeromq-4.3.4.tar.gz”文件是0MQ库的4.3.4稳定版本,发布于2021年1月17日。下面我们将深入探讨0MQ的...

    zeromq-4.3.4.zip

    0MQ(也称为ZeroMQ或ØMQ)是一个开源的消息队列库,它为开发者提供了一种高效、灵活的异步消息传递机制。标题中的"zeromq-4.3.4.zip"指的是这个库的4.3.4版本的源代码压缩包。这个稳定版在2021年1月17日发布,意味...

    ZeroMQ 消息通信库_共同学习2.zip

    3. **模式丰富**: ZeroMQ支持多种消息传递模式,如发布/订阅(Pub/Sub)、请求/响应(Req/Rep)、推送/拉取(Push/Pull)以及对等(Pair),这些模式为不同类型的通信场景提供了灵活性。 4. **错误恢复**: ZeroMQ...

    ZeroMQ初体验.rar_ZeroMQ初体验_zeromq

    标题"ZeroMQ初体验.rar_ZeroMQ初体验_zeromq"表明这是一个关于ZeroMQ的初级教程,适合对ZeroMQ不熟悉的读者。"初体验"暗示我们将探讨的是基础知识,包括ZeroMQ的基本概念、安装和简单用法。 描述中的"希望对ZeroMQ...

    ZeroMQ官方文档中文版.pdf

    ZeroMQ是一个高性能的异步消息库,设计用于跨多个不同语言编写的计算机程序或服务的简单通信。它实现了消息队列的模式,并且包含多种通信模式,如请求-应答、发布-订阅和推送-拉取等。本知识点将详细介绍ZeroMQ的...

    ZMQ/ZeroMQ使用手册

    手册目录:ZeroMQ基础、ZeroMQ进阶、高级请求-应答模式、可靠的请求-应答模式、高级发布-订阅模式。 ZMQ(ØMQ、ZeroMQ, 0MQ)看起来像是一套嵌入式的网络链接库,但工作起来更 像是一个并发式的框架。它提供的套接...

    ZeroMQ指南.pdf

    ZeroMQ提供了多种通信模式,包括请求-应答模式、发布-订阅模式、pipeline模式等,满足不同的应用场景。 ZeroMQ基础 ZeroMQ是一种基于消息队列的异步通信机制,它提供了一个灵活的、可靠的、可扩展的消息传递机制,...

    ZeroMQ-一个基于内存的消息队列

    而REQ/REP模式则适合用于客户端-服务器架构,一个请求者发送请求到一个应答者,应答者处理请求后返回结果。 ZeroMQ支持多种编程语言的API,如Python、Java、PHP、C#等,这意味着开发人员可以在他们熟悉的环境中使用...

    zeromq中多线程的jave实现

    zeromq是一个强大的开源消息库,它提供了多种高级通信模式,包括发布/订阅、请求/应答、推送/拉取以及本文重点讨论的Dealer-Router模式。在Java中,我们通常使用jeromq这个库来操作zeromq,因为它是对zeromq原生API...

    ZeroMQ指导

    在ZeroMQ的世界中,我们假设用户已经具备一定的网络编程知识,了解TCP/IP协议以及套接字编程,并且熟悉异步编程模式。 #### 请求与响应 请求与响应模式是网络通信中的一个常见模式,0MQ通过其套接字模式提供了对这...

    ZeroMQ4 0 5 dll jar java 用下载

    ZeroMQ,又称0MQ或ZMQ,是一款轻量级、高性能的消息队列系统,它提供了一种分布式的、异步的通信模型,适用于多种编程语言,包括C、C++、Python、Java等。在本资源中,你将找到ZeroMQ 4.0.5版本的DLL(动态链接库)...

    ZeroMQ 云时代极速消息通信库(完整版)

    2. 连接模式:ZeroMQ支持多种传输模式,包括发布-订阅(Publish-Subscribe)、请求-应答(Request-Reply)、推送-拉取(Push-Pull)等。这些模式可以组合使用来构建复杂的消息传递拓扑。 3. 扩展性与灵活性:它拥有...

    ZMQ API -v4.1.pdf

    29. **zmq_proxy**: 启动内置的ZeroMQ代理,用于简化模式如代理、发布者/订阅者、请求者/应答者等。 30. **zmq_recvmsg**: 同zmq_msg_recv,接收消息的一部分。 31. **zmq_recv**: 接收套接字上的消息部分。 32. ...

    ZeroMQ Guide英文版

    ZeroMQ(通常称为ØMQ、0MQ或zmq)是一个开源的消息库,它提供了多种消息传输协议的抽象,旨在以一种简单的方式创建网络通信模式。其设计目标是简化网络编程,提高消息处理的速度和可靠性。作为消息队列(Message ...

    cpp-czmq一个ZeroMQ的高级绑定

    你可以创建各种类型的套接字,例如 `ZMQ_PUB`(发布者)、`ZMQ_SUB`(订阅者)、`ZMQ_REQ`(请求者)、`ZMQ_REP`(应答者)、`ZMQ_DEALER`(经销商)和 `ZMQ_ROUTER`(路由器)等,这些套接字对应不同的通信模式。...

    消息队列zeromq学习的安装包之一libsodium

    它抽象出四种基本的消息模式:请求/应答(Request/Reply),发布/订阅(Publish/Subscribe),推送/拉取(Push/Pull)和管道(Pipeline)。这些模式覆盖了大多数常见的通信场景,使得开发者可以快速构建出高性能的...

    编译好的ZeroMQ的Windows X64发布文件

    ZeroMQ,也称为0MQ或zeromq,是一款开源的消息中间件,它为开发者提供了一种高效、灵活的异步消息通信机制。在分布式计算环境中,ZeroMQ扮演着重要的角色,帮助不同进程间进行快速、可靠的通信。它具有轻量级、高...

    ZQM-Guide文字版(中文)

    描述中提到的具体章节包括"1:ZeroMQ基础"、"2:ZeroMQ进阶"以及"3:高级请求-应答模式",意味着这份指南将深入讲解ZeroMQ的基本概念、高级用法以及特定的通信模式。 **ZeroMQ概述** ZeroMQ是一款轻量级的消息...

    zeroMq中文帮助文档

    ZeroMQ,简称ZMQ,是一种基于套接字(sockets)的高性能异步消息库,旨在提供一种简单的方式来解决进程间通信(IPC)以及网络通信的问题。它支持多种语言,广泛应用于分布式计算环境。ZeroMQ 中文帮助文档为中文使用...

    zmqRouter:使用ZeroMQ构建的消息分发中间件Demo,支持异步并发,提供CppPythonCpp2py多种交互方式

    ZeroMQ提供的ROUTER / DEALER组合模式,可以轻松地构建一个高级异步的C / C ++后台服务框架。ROUTER可以高效的接收客户端的请求,而DEALER可以负载均衡的调度工人工作。多,逐步工人处理不过来,需要增加工人的时候...

Global site tag (gtag.js) - Google Analytics