ZMQ(jzmq) - ZThread的目的是什么?

时间:2018-03-07 08:43:49

标签: thread-safety zeromq jzmq

我正在使用jzmq包来为我的项目通过网络进行通信。我正在使用DEALER ROUTER对。我已经读过DEALERROUTER类型的套接字不是线程安全的。所以我不能在2个不同的线程上从同一个套接字发送或接收。

我的问题是
1)jzmq包中 ZThread 类的用途是什么?

2)它是否处理这个线程不安全?

3)如果从父线程及其子级ZThread使用它,我可以从同一套接字发送和接收吗?

4)AttachedAdetachedRunnable之间有什么区别?

1 个答案:

答案 0 :(得分:1)

事实#0:ZeroMQ从来都不是线程安全的(零共享Zen)

尽管最近的努力(2017年末发布了4.2+总体重新设计努力以消除这一已知的初始原则),ZeroMQ教育材料尽可能地出现,并解释为什么有一个坏习惯试图分享设计实践中的玩具。

Ad 2)

即使有人获得了一些API附带的承诺,但如果有人愿意为这种事后分享原则支付失去性能的成本,那么总是先对性能进行基准测试。正如关于ZeroMQ本机API所述,主要没有任何东西可以共享(有一个例外,有时可能有意义,全局Context() - 实例)。线程可以从这样的全局Context()实例“借用”IO套接字实例,但永远不会共享套接字实例,因为ZeroMQ本机API内部和下部都不能保证结果,所以即使承诺也不会更好所以“高于”任何一种更高级别的API。

Ad 3)不,

按照2),永远不要共享套接字,没有理由尝试这样做。如果管理资源(并且线程是资源中的一等公民),最好在PAIR/PAIR之上创建一个私有的,点对点的PUSH/PULL{ inproc:// | ipc:// }(甚至是单向管道) - 运输-class(其中inproc://可以用于性能激励的情况甚至使用另一个“共同本地隔离的”私有Context(0)实例,实际上确实没有IO线程,并享受到与之关系的适当分离对主要丢失的线程安全(如果不这样做)和性能的最小不利影响。

Ad 1 + 4)

  

(CZMQ / 3.0.1 API文档) zthread - 使用系统线程(不建议使用)
  ...
  zthread类包装OS线程创建。它创建看起来像普通操作系统线程的分离线程,或者共享调用者的ØMQ上下文的附加线程,并获得一个inproc管道以与父线程对话。分离的线程根据需要创建自己的ØMQ上下文。注意:不推荐使用此类,而使用zactor

可以更好地检查使用的本机API,绑定/包装器版本和文档中的版本蠕变。

然而,Zero共享Zen可能会引导您的步骤(如果选择的语言绑定允许在设计决策中保持自由 - 阅读原始设计动机总是有助于理解The Original的性能和安全见解。)