事实 #0:ZeroMQ 从来都不是线程安全的(有零共享 Zen)
尽管最近做出了一些努力(于 2017 年末发表了关于 4.2+ 的总体重新设计努力以消除这一已知的初始原则),但 ZeroMQ 教育材料尽可能地提供,并解释了为什么尝试在分布式中共享玩具的坏习惯- 系统设计实践。
广告 2)
即使有人得到了一些 API 的承诺,也总是首先对性能进行基准测试,如果有人愿意为这种事后共享原则支付性能损失的成本。正如关于 ZeroMQ 原生 API 所指出的,基本上没有什么可共享的(有一个例外,有时可能有意义,即全局 Context()-instance )。线程可以从这样的全局 Context()-instance 中“借用”IO-socket 实例,但从不共享 socket-instances,因为在 ZeroMQ 本机 API 内部和下不能保证结果,因此即使承诺也不会更好所以“高于”任何更高级别的 API。
广告 3 ) 不,
根据 2 ),永远不要共享套接字,没有理由尝试这样做。如果管理资源(并且线程是资源中的一等公民),最好创建一个私有的、点对点的PAIR/PAIR
或PUSH/PULL
(甚至与单工管道串联) over { inproc:// | ipc:// }
-transport-class(inproc://
出于性能动机的情况甚至可以使用另一个“co-本地隔离的”私有Context(0)
实例,实际上完全没有 IO 线程)并享受适当的关注点分离,而对主要丢失的线程安全(如果不这样做)和性能的不利影响最小。
广告 1 + 4)
(CZMQ/3.0.1 API 文档) zthread
- 使用系统线程(已弃用)
......
该类zthread
包装了 OS 线程的创建。它创建看起来像普通 OS 线程的分离线程,或共享调用者的 ØMQ 上下文的附加线程,并获得inproc
与父线程对话的管道。分离的线程根据需要创建自己的 ØMQ 上下文。注意:这个类已被弃用,取而代之的是zactor
.
最好检查使用的本机 API、绑定/包装器版本和文档之间的版本变化。
然而,零共享 Zen 可能会引领您的脚步(如果选择的语言绑定允许您在设计决策中保持自由 - 阅读原始设计动机总是有助于理解 The Original 的性能和安全见解)。