【问题标题】:using zmq PUSH socket per producer thread vs dedicated zmq thread for all threaded producers每个生产者线程使用 zmq PUSH 套接字与所有线程生产者的专用 zmq 线程
【发布时间】:2013-07-16 21:50:10
【问题描述】:

ZeroMQ 指南中明确指出,套接字不能在线程之间共享。如果有多个线程生产者需要通过 zmq 推送他们的输出,我看到了两种可能的设计模式:

  • 每个生产者线程 0mq 套接字
  • 单独线程中的单个 0mq 套接字

在第一种情况下,每个线程处理自己的事务。在后者中,您需要一个线程安全队列,所有生产者都向该队列写入,0mq 线程从该队列读取然后发送。

在这两种模式之间进行选择的因素是什么?各有什么优缺点?

【问题讨论】:

    标签: multithreading zeromq


    【解决方案1】:

    很大程度上取决于有多少生产者。

    如果只有少数几个,那么每个线程有一个套接字是可管理的,并且效果很好。

    如果有很多,那么带有单个套接字推送的生产者-消费者队列(实际上是队列的消费者和下游套接字的单个生产者)可能会更快。运行大量套接字并非没有成本。

    第一种情况的主要优点是它更容易横向扩展为每个生产者分离进程,每个生产者都是单线程的,有自己的套接字。

    【讨论】:

      【解决方案2】:

      我问了一个similiar 的问题。

      您可以使用工作线程池like this,其中每个工作线程通过 ThreadLocal 有一个专用的 0mq 套接字,确保在创建它们的线程中使用和销毁套接字

      您还可以使用套接字池,可能以ArrayBlockingQueue 为后盾,并在需要时获取/替换套接字。这种方法不如专用套接字方法安全,因为它在不同线程之间(同步)共享套接字对象;你应该没问题,因为 Java 处理锁定,但它不是 0mq 推荐的方法。

      希望对你有帮助...

      【讨论】:

        猜你喜欢
        • 2014-11-08
        • 1970-01-01
        • 2013-11-10
        • 2021-02-16
        • 1970-01-01
        • 1970-01-01
        • 2018-09-24
        • 2017-02-01
        • 2012-04-30
        相关资源
        最近更新 更多