我正在使用jzmq
包为我的项目通过网络进行通信。我正在使用DEALER ROUTER
对。我读到DEALER
和ROUTER
类型的套接字不是线程安全的。所以我不能在 2 个不同的线程上从同一个套接字发送或接收。
我的问题是:
1)jzmq包中ZThread
类的目的是什么?
2 ) 它是否处理此线程不安全?
3 ) 如果从父线程及其子线程ZThread
使用它,我可以从同一个套接字发送和接收吗?
4)还有Attached
和AdetachedRunnable
有什么区别?
事实 #0:ZeroMQ 从来都不是线程安全的(有零共享 Zen)
尽管最近做出了努力(2017年底发表了关于4.2+总重新设计努力以消除这个已知的初始原则),但ZeroMQ教育材料尽可能呈现,并解释了为什么在分布式系统设计实践中尝试共享玩具的坏习惯。
广告 2 )
即使有人得到了一些API烘焙的承诺,如果一个人想为这种事后共享原则付出性能损失的代价,也总是首先对性能进行基准测试。正如关于 ZeroMQ 原生 API 所指出的,基本上没有什么可共享的(除了一个例外,有时可能是有意义的,全局 Context()-实例)。线程可以从这样的全局 Context() 实例中"借用"IO 套接字实例,但从不共享套接字实例,因为结果在 ZeroMQ 本机 API 内部和之下无法保证,因此即使承诺如此"高于"任何类型的更高级别 API,也不会更好。
广告 3 ) 否,
根据 2 ),永远不要共享套接字,没有理由尝试这样做。如果管理资源(线程是资源中的一等公民),最好创建一个私有的、点对点的PAIR/PAIR
或PUSH/PULL
(即使是单工管道串联)而不是{ inproc:// | ipc:// }
传输类(inproc://
可以为性能动机的情况,甚至使用另一个"共本地隔离"的私有Context(0)
实例,实际上根本没有 IO 线程),并享受适当的关注点分离,对主要丢失的线程安全(如果不这样做)和性能的不利影响最小。
广告 1 + 4 )
( CZMQ/3.0.1 API 文档)
zthread
- 使用系统线程(已弃用)
...zthread
类包装操作系统线程创建。它创建看起来像普通操作系统线程的分离线程,或共享调用方 ØMQ 上下文的附加线程,并获取inproc
管道以与父线程通信。分离的线程根据需要创建自己的ØMQ上下文。注意:不推荐使用此类,取而代之的是zactor
。
可以更好地检查所使用的本机 API、绑定/包装器版本和文档之间的版本蠕变。
然而,零共享禅可能会引导你的脚步(如果选择的语言绑定允许一个人在设计决策中保持自由 - 阅读原始设计动机总是有助于理解原始的性能和安全见解)。