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