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

zeroMQ初体验-10.优雅的使用多线程

    博客分类:
  • MQ
阅读更多
"或许,ZeroMQ是最好的多线程运行环境!"官网如是说。

其实它想要支持的是那种类似erlang信号模式。传统多线程总会伴随各种"锁"出现各种稀奇古怪的问题。而zeroMQ的多线程致力于"去锁化",简单来说,一条数据在同一时刻只允许被一个线程持有(而传统的是:只允许被一个线程操作)。而锁,是因为可能会出现的多线程同时操作一条数据才出现的副产品。从这里就可以很清晰的看出zeromq的切入点了,通过线程间的数据流动来保证同一时刻任何数据都只会被一个线程持有。

这里给出传统的应答模式的例子:

import time
import threading
import zmq

def worker_routine(worker_url, context):
    
    socket = context.socket(zmq.REP)
    
    socket.connect(worker_url)
    
    while True:
        
        string  = socket.recv()
        print("Received request: [%s]\n" % (string))
        time.sleep(1)
        
        socket.send("World")

def main():    
    url_worker = "inproc://workers"
    url_client = "tcp://*:5555"
    
    context = zmq.Context(1)
    
    clients = context.socket(zmq.XREP)
    clients.bind(url_client)
    
    workers = context.socket(zmq.XREQ)
    workers.bind(url_worker)
    
    for i in range(5):
        thread = threading.Thread(target=worker_routine, args=(url_worker, context, ))
        thread.start()
    
    zmq.device(zmq.QUEUE, clients, workers)
    
    clients.close()
    workers.close()
    context.term()
    
if __name__ == "__main__":
    main()


这样的切分还有一个隐性的好处,万一要从多线程转为多进程,可以非常容易的把代码切割过来再利用。
这里还给了一个用多线程不用多进程的理由:
进程开销太大了(话说,python是鼓励多进程替代线程的)。

上面代码给出的例子似乎没有子线程间的通信啊?既然支持用多线程,自然不会忘了这个:

import threading
import zmq

def step1(context):
    sender = context.socket(zmq.PAIR)
    sender.connect("inproc://step2")   
    sender.send("")  

def step2(context):
    receiver = context.socket(zmq.PAIR)
    receiver.bind("inproc://step2")
    
    thread = threading.Thread(target=step1, args=(context, ))
    thread.start()
    
    string = receiver.recv()

    sender = context.socket(zmq.PAIR)
    sender.connect("inproc://step3")
    sender.send("")
    
    return

def main():
    context = zmq.Context(1)
    
    receiver = context.socket(zmq.PAIR)
    receiver.bind("inproc://step3")
    
    thread = threading.Thread(target=step2, args=(context, ))
    thread.start()
    
    string = receiver.recv()
    
    print("Test successful!\n")
    
    receiver.close()
    context.term()
    
    return

if __name__ == "__main__":
    main()


注意:
这里用到了一个新的端口类型:PAIR。专门为进程间通信准备的(文中还列了下为神马么用之前已经出现过的类型比如应答之类的)。这种类型及时,可靠,安全(进程间其实也是可以用的,与应答相似)。

(未完待续)
分享到:
评论
2 楼 iyuan 2012-08-29  
penelox 写道
你好,请问,如果我需要发送的数据,是一个自己定义的先进先出的队列,这个队列我需要在其他线程中写入数据,在zeromq创建的线程中发送数据,该如何做?
问题如下:
1.指南里说,不能在多线程中共享统一数据,那我该怎么保证另一线程插入数据的时候,跟zeromq线程的同步性
2.不是用zeromq创建的线程,能否和zeromq线程同时交互使用?


这两个问题本质上应该是一个吧。zmq是通过数据传递来确保同一数据在某一时刻只能被一个线程持有和处理,在这个基础上并没有什么同步性的存在,此结构天然异步的,只要符合其信号传递的规则(满足amqp协议),自然可以交互,不过按照你的描述,这应该算是进程间的交互了。
1 楼 penelox 2012-08-28  
你好,请问,如果我需要发送的数据,是一个自己定义的先进先出的队列,这个队列我需要在其他线程中写入数据,在zeromq创建的线程中发送数据,该如何做?
问题如下:
1.指南里说,不能在多线程中共享统一数据,那我该怎么保证另一线程插入数据的时候,跟zeromq线程的同步性
2.不是用zeromq创建的线程,能否和zeromq线程同时交互使用?

相关推荐

    zeromq-2.1.7.tar.gz

    在Linux系统中,为了使用zeromq-2.1.7,首先需要解压这个文件。你可以使用以下命令来完成: ```bash tar -zxvf zeromq-2.1.7.tar.gz ``` 解压后,你将得到一个名为 "zeromq-2.1.7" 的目录,其中包含了源代码和其他...

    zeromq-3.2.5.tar.gz、jzmq.tar.gz、Python-2.6.6.tar.bz2、storm-0.8.0.zip下载

    这里提供的四个压缩包文件,Python-2.6.6.tar.bz2、zeromq-3.2.5.tar.gz、jzmq.tar.gz以及storm-0.8.0.zip,都是与Storm搭建和运行相关的资源。 首先,我们来详细了解一下每个文件的作用: 1. **Python-2.6.6.tar....

    zeromq-4.0.3.tar.gz.zip

    在实际使用中,开发者首先需要将 zeromq-4.0.3.tar.gz 解压缩,然后按照文档指示进行编译和安装。编译通常包括配置、编译和安装三个步骤,即: 1. `tar -zxvf zeromq-4.0.3.tar.gz` 解压文件。 2. `cd zeromq-4.0.3`...

    zeromq-4.1.8.tar.gz

    zeromq还支持更复杂的模式,例如通过多线程或进程实现并发处理,通过代理(broker)实现更大规模的分布式通信。其高性能和轻量级的特性使得它在大数据、物联网、实时系统等领域有着广泛的应用。 总的来说,zeromq-...

    zeromq-4.2.3.tar.gz

    1. **解压**:使用`tar -zxvf zeromq-4.2.3.tar.gz`命令解压文件。 2. **配置**:进入解压后的目录,运行`./configure`以检测系统并生成Makefile。 3. **编译**:执行`make`命令来编译源代码。 4. **安装**:使用`...

    zeromq-2.1.9.tar.gz

    `zeromq-2.1.9.tar.gz` 是zeromq的一个特定版本,即2.1.9版,通常以源码形式提供,需要通过编译来安装。 首先,让我们深入了解zeromq的核心概念。zeromq设计了一个灵活的套接字模型,它允许开发者构建复杂的网络...

    zeromq-4.0.5-4.el7.x86_64.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    zeromq-4.1.3.tar.gz

    在使用 zeromq-4.1.3.tar.gz 开发工具包时,你需要先解压文件,然后根据 ZeroMQ 的安装指南,配置编译环境,编译并安装到你的系统中。一旦完成,你就可以在你的项目中使用 ZeroMQ 提供的功能,享受其强大的消息传递...

    zeromq-4.3.4.tar.gz

    0MQ(也称为 ZeroMQ 或 ØMQ)是一个开源的消息中间件,它提供了一种轻量级、高性能的异步消息...通过使用“zeromq-4.3.4.tar.gz”,你可以享受到这个版本带来的稳定性和优化,从而更高效地实现跨进程、跨网络的通信。

    zeromq-4.3.4.zip

    2. **高并发**:通过使用非阻塞I/O和高效的多线程模型,0MQ可以处理大量并发连接和消息。 3. **模式丰富**:支持多种消息模式,如发布/订阅、请求/应答、推送/拉取和一对多等,这些模式可以灵活地组合以适应不同的...

    zeromq-4.2.0.tar.gz源码包

    在zeromq-4.2.0源码包中,你可以找到以下主要组成部分: 1. **源代码**:包含了zeromq的核心库和各种语言的绑定。核心库通常用C++编写,提供了跨平台的API,而绑定则允许开发者使用Python、Java、C#等其他语言与...

    zeromq-4.2.0.tar.zip

    要解压并访问这些文件,用户需要先使用`gunzip`或`zcat`命令解压gz文件,然后再用`tar`命令解包,例如:`gunzip zeromq-4.2.0.tar.gz`后,再执行`tar -xvf zeromq-4.2.0.tar`。 在使用ZeroMQ时,开发者通常会使用C...

    zeromq-4.1.2.tar.gz

    ZMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。

    zeromq-3.2.5.tar.gz

    ZeroMQ是一个网络通讯库,其主要用来为分布式应用程序开发提供进程间通信(此处的进程既可以是同一台机器上的两个进程也可以是不同机器上的两个进程)。ZeroMQ的特点在于灵活的通信手段和丰富的连接模型,并且它可以...

    zeromq-4.1.4.tar.gz

    ZeroMQ是一个网络通讯库,其主要用来为分布式应用程序开发提供进程间通信(此处的进程既可以是同一台机器上的两个进程也可以是不同机器上的两个进程)。ZeroMQ的特点在于灵活的通信手段和丰富的连接模型,并且它可以...

    zeromq-4.3.2.tar.gz

    zeromq的一个亮点是它的多线程支持。通过使用高效的I/O模型,zeromq可以在单个线程中处理多个连接和请求,降低了线程切换的开销,从而提升了系统的并发性和性能。这对于高并发的应用场景尤其有利。 此外,提到配合...

    zeromq-3.12.5.zip

    以上就是使用"zeromq-3.12.5.zip"和"apache-storm-1.1.1"在Linux下搭建Storm集群的关键步骤。在实际操作中,可能还需要根据具体环境和需求进行调整,例如配置Zookeeper、调整Storm的配置参数等。理解这些基础组件的...

    zeromq-4.1.0-rc1.zip

    这个“zeromq-4.1.0-rc1.zip”压缩包包含了ZeroMQ 4.1.0版本的源代码,这是一个预发布版本(Release Candidate),意味着它是正式版发布前的最后一个测试版本。 ZeroMQ的核心概念是提供一种抽象的网络通信层,允许...

    zeromq-4.0.1.tar.gz

    1. **解压**:使用tar命令解压文件,例如`tar -zxvf zeromq-4.0.1.tar.gz`。 2. **配置**:进入解压后的目录,使用`./configure`命令进行配置,检查系统环境和依赖。 3. **编译**:执行`make`命令进行编译。 4. **...

    Win64-ZeroMQ-JZMQ-CZMQ.zip

    VS2015 在Widows 10 上编译的 ZeroMQ 4.3.2,JZMQ 3.1 CZMQ 4.2,可以在 JDK 1.8 下运行。DLL 都是 64位,包含了编译及运行相关信息。分享一下,也给自己留个备份

Global site tag (gtag.js) - Google Analytics