zeromq的扭曲绑定

vic-txZMQ的Python项目详细描述


Introduction

注意

这不是original version of txZMQ,这是一个重构版本 由Victor Lin制作的TXZMQ。

txzmq允许轻松地将0MQ套接字集成到 扭曲事件回路(反应堆)。

txzmq同时支持cpython和pypy。

Improvement

原TXZMQ的API设计错误,不可重用或 例如,很难使用设置zeromq套接字的hwm,您需要更改 类级别变量。:

from txzmq import ZmqConnection
ZmqConnection.highWaterMark = 100
conn = ZmqConnection(factory)

正如您所看到的,highwatermark变量会影响之后建立的所有连接。 这显然不是一个好的设计。

另外,端点的封装也不是必需的。有时你可能需要 要在创建zmqconnection后连接或绑定地址,原始 设计没有明显的方法。创建 新的zmqconnection。

原始版本中不存在推/拉和对连接。我补充 这个库中的那些连接类型。

原始版本中还有a serious bug。读取信号时 在反应堆进行另一次选择之前触发FD,然后TXZMQ停止 再从那个插座读下去。这个版本修复了这个错误。

Requirements

需要非python库:

  • 0mq库>;=2.1(用2.1.4进行了大量测试)

需要python包:

  • pyzmq(用于cpython)
  • pyzmq cTypes(用于pypy)
  • 扭曲

Details

txzmq引入了对类^{tt1}的常规0mq套接字的支持$ 它可以进行基本的事件循环集成,在 无阻塞方式,多部分信息分散收集。

txzmq使用mqapi获取用于发出挂起信号的文件描述符 在单独线程中运行的_MQ库IO线程的操作。这是用在 一个自定义的文件描述符读取器,然后添加到Twisted reactor中。

在这个类中,可以实现由0mq定义的各种模式。为了 例如,ZmqConnection类的特殊后代, ZmqPubConnectionZmqSubConnection,为 公共/子插座。

请求/应答模式是通过xreq/xrep套接字和类ZmqXREQConnection实现的, ZmqXREPConection

推/拉模式是通过类ZmqPushConnection实现的, ZmqPullConection

最后,通过类ZmqPairConnection实现对模式。

Example

下面是使用txzmq的示例:

import os
import sys
import time
from optparse import OptionParser

from twisted.internet import reactor

import zmq
from txzmq import ZmqFactory, ZmqPubConnection, ZmqSubConnection

parser = OptionParser("")
parser.add_option("-m", "--method", dest="method", help="0MQ socket connection: bind|connect")
parser.add_option("-e", "--endpoint", dest="endpoint", help="0MQ Endpoint")
parser.add_option("-M", "--mode", dest="mode", help="Mode: publisher|subscriber")
parser.set_defaults(method="connect", endpoint="epgm://eth1;239.0.5.3:10011")

(options, args) = parser.parse_args()

zf = ZmqFactory()

def bind_or_connect(s):
    if options.method == 'bind':
        s.bind(options.endpoint)
    elif options.method == 'connect':
        s.connect(options.endpoint)

if options.mode == "publisher":
    pub = ZmqPubConnection(zf)
    bind_or_connect(pub)

    def publish():
        data = str(time.time())
        print "publishing %r" % data
        pub.send(data)

        reactor.callLater(1, publish)

    publish()
else:
    def doPrint(msgs):
        print "message received: %r" % (msgs, )
    sub = ZmqSubConnection(zf, callback=doPrint)
    sub.setsockopt(zmq.SUBSCRIBE, '')
    bind_or_connect(sub)

reactor.run()

源代码中也有相同的示例。你可以从 使用以下命令(在两个不同的终端中)签出目录:

examples/pub_sub.py --method=bind --endpoint=ipc:///tmp/sock --mode=publisher

examples/pub_sub.py --method=connect --endpoint=ipc:///tmp/sock --mode=subscriber

Hacking

txzmq的源代码位于github; 欢迎使用分叉和拉取请求。

要开始黑客攻击,在github分叉并克隆到您的工作目录。使用 makefile(用于运行单元测试、检查pep8符合性和运行 pyflakes),您将需要安装virtualenv(它包括 pip安装)。

创建一个分支,添加一些单元测试,编写代码,检查并测试它! 一些有用的make目标是:

  • make env
  • make check
  • make test

如果您没有设置环境,将在中为您创建一个新环境 ./env。此外,还将按照要求安装TXZMQ 开发libs。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
如何使用外部java程序在minecraft中移动minecraft角色的相机   java输出文本文件中的变量   java LazyLoadingException在我尝试从多通关系获取对象时出现   java json rest API的错误:ClassCastException:org。json。无法将JSONObject强制转换为组织。json。杰索纳雷   java BigInteger。C中的intValue()等价物#   java大写所有字符,但不包括带引号字符串中的字符   java获取特殊字符   javascript为什么Selenium中的所有getX()调用都需要这么长时间?   rabbitmq rabbitmq java客户端并行消费   如何使用selenium Java在popover窗口中提取文本   对象在java中构造一类对象   java Room数据库未实现   json JSONObject可以使用java保存大的格式化双值吗?   有时限的旅行推销员   java HttpsURLConnection openConnection查询   java无法使用Spring@Entity注释创建MySQL表   lambda Java 8仅映射到值类型集合   java提供OSGi服务而不实现接口   java单个对象重写对象数组,不确定原因