每个生产者线程使用zmq PUSH套接字与所有线程生成器的专用zmq线程一起使用

时间:2013-07-16 21:50:11

标签: multithreading zeromq

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

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

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

在这两种模式之间进行选择有哪些因素?每个人的优点是什么?

2 个答案:

答案 0 :(得分:1)

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

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

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

第一种情况的主要原因是,很多更容易扩展为每个生产者分离进程,每个生成器都有自己的套接字。

答案 1 :(得分:1)

我问过similiar问题。

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

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

希望它有所帮助...