为什么ZeroMQ推荐为一个应用创建一个Context?

Why does ZeroMQ recommend creating one Context for an application?

我已阅读指南中建议创建一个上下文的部分。我以前的应用程序实现有多个上下文,我临时创建了这些上下文以获得订阅 运行。我已将其更改为对所有订阅使用单一上下文。

创建多个上下文有什么缺点?这样做有哪些用例?该指南包含以下内容:

Getting the Context Right

ZeroMQ applications always start by creating a context, and then using that for creating sockets. In C, it’s the zmq_ctx_new() call. You should create and use exactly one context in your process. Technically, the context is the container for all sockets in a single process, and acts as the transport for inproc sockets, which are the fastest way to connect threads in one process. If at runtime a process has two contexts, these are like separate ZeroMQ instances. If that’s explicitly what you want, OK, but otherwise remember

这是否意味着使用多个上下文效率不高,但它仍然有效?

Q : "What are the drawbacks of creating multiple contexts ... ?"

消耗的资源。没有其他的。一个人生成的 Context() 实例越多,分配的内存就越多,为此花费的开销时间也就越多。

一次性附加成本可能是一个缺点 - 有些人忘记了 (and forget to account for setup & termination add-on costs there) where small amounts of "useful"-work may start to be expensive right due to the (for some, ... it may surprise how often & how many ... hidden) add-on costs in attempts to distribute/parallelise some part of the application workloads, yet need not bother you, if not entering low-latency 或超低延迟域。 运行-time 附加开销(维护每个 Context()-instances 内部工作 - 是的,它在后台工作,所以即使什么都不做也会消耗一些 CPU-clocks ) 可能会开始遇到麻烦,当半持久实例的数量增加时(也取决于 CPU-微架构 & O/S & 软实时需求,如果存在的话)

Q : "What ... use cases are there for doing so?"

当优秀的软件架构师设计代码以获得终极性能并尝试削减最后几纳秒时,我们就开始了。

使用经过深思熟虑和精心设计的专业化-Context()-引擎,由此产生的 ZeroMQ 性能可能会增长到几乎基于 CPU/memory-I/O 的极限。人们可能想在我对 ZeroMQ 设计原则的宣传中阅读更多关于相对优先级、CPU-核心映射和其他高性能技巧的信息。

Q : "Does this mean that it's just not as efficient to use multiple contexts, but it would still work?"

部分 “它仍然有效” 更容易 - 如果不违反 O/S 最大数量允许的线程数,如果仍有 RAM 可用于存储用于平台外传递的消息的实际流,它使用额外的、O/S 特定的缓冲区——是的,额外的 SpaceDOMAIN 和 TimeDOMAIN 附加组件延迟和延迟抖动成本开始出现。

零拷贝inproc:// TransportClass 能够实际执行内存映射零拷贝消息数据的纯内存中标志信号,即从不移动。在特定情况下,对于这样的 inproc://-only low-latency data-"flow 可以有 zero-I/O-threads Context()-instances “ 模型,因为数据是零复制的并且从不 ”流 ;o) ).

Q : "Why does ZeroMQ recommend..."

好吧,这似乎是最初 Pieter HINTJENS 和 Martin SUSRIK 宣传零共享、零阻塞设计的一部分。对于 Herd of Nerds 来说,这几乎是一种邪恶的反模式,他们 lock/unlock “共享”资源并突然被置于与 ZeroMQ 智能行为设计理念相反的哲学(无需深入了解)。

Zen-of-Zero 的艺术 - 永不分享、永不阻止、永不复制(如果不需要这样做)对 Nerds 来说是惊人的惊人,他们最初无法意识到其优势(因为他们几十年来,我们一直在输入难以阅读、难以重写、难以调试的代码,这正是由于大量引入了共享、锁定和阻塞的部分,并且 they/we 被“引以为豪”成为书呆子,他们“可以”,并非我们所有的同事都能够 decode/understand 改进越少)。

能够在全球共享的“中心”Context()-实例对于那些开始阅读、学习和使用新范例的人来说是一个光明的标志。

在 12 年多之后,这可能看起来很神秘,但零禅的艺术就是从这种痛苦开始的(以及整个行业“文化”而非技术拒绝的风险)。

直到今天,这对 Pieter HINTJENS 和 Martin SUSTRIK 来说都是勇敢的一步。

最终〜尊重!〜他们一起进行的整个工作......为了我们学习他们的见解以及在BAU中重新使用它们的机会......不眨眼。

伟大的思想。