ZMQ (jzmq) - ZThread 的用途是什么?
ZMQ (jzmq) - what is the purpose of the ZThread?
我正在为我的项目使用 jzmq
包来通过网络进行通信。我正在使用 DEALER ROUTER
对。我读过 DEALER
和 ROUTER
类型 的套接字不是线程安全的 。所以我不能在 2 个不同的线程上从同一个套接字发送或接收。
我的问题是:
1)jzmq包中ZThread
class的作用是什么?
2 ) 它是否处理这个线程不安全?
3 ) 如果从父线程及其子线程使用它,我可以从同一个套接字发送和接收吗?ZThread
?
4 ) 另外 Attached
和 AdetachedRunnable
有什么区别?
事实 #0:ZeroMQ 从来没有 thread-safe(零共享 Zen)
尽管最近做出了努力(于 2017 年末发表了 4.2+ 总 re-design 努力来消除这个已知的初始原则),但尽可能提供 ZeroMQ 教育材料并解释为什么有一个坏习惯尝试在 distributed-system 设计实践中分享玩具。
广告 2)
即使有人得到一些 API-baked 承诺,如果有人愿意为这种 ex-post 共享原则付出性能损失的代价,始终首先要对性能进行基准测试。正如关于 ZeroMQ 本机 API 所指出的那样,基本上没有什么可以共享的(除了一个例外,有时可能有意义,即全局 Context()-instance)。线程可以 "borrow" 来自这样一个全局 Context() 实例的 IO-socket 实例化,但永远不会共享 socket-instances,因为在 ZeroMQ 本机 API 内部和之下无法保证结果所以即使承诺也不会更好 "above" 任何更高级别 API.
广告 3) 否,
根据 2 ),从不共享套接字,没有理由尝试这样做。如果管理资源(并且线程是 first-class 资源中的公民),最好在 { inproc:// | ipc:// }
上创建一个私有的、点对点的 PAIR/PAIR
或 PUSH/PULL
(即使是串联的单工管道) -transport-class(其中 inproc://
可以针对性能驱动的情况甚至使用另一个 "co-locally-isolated" 私有 Context(0)
-实例,实际上 IO-threads 完全为零)并享受应有的待遇分离关注点,对主要损失的 thread-safety(如果不这样做)和性能产生最小的不利影响。
广告 1 + 4)
( CZMQ/3.0.1 API docs ) zthread
- working with system threads (deprecated)
...
The zthread
class wraps OS thread creation. It creates detached threads that look like normal OS threads, or attached threads that share the caller's ØMQ context, and get an inproc
pipe to talk back to the parent thread. Detached threads create their own ØMQ contexts as needed. NOTE: this class is deprecated in favor of zactor
.
最好检查一下本机 API 使用的版本、绑定/包装器版本和文档。
然而,零共享 Zen 可能会引领您的脚步(如果选择的语言绑定允许一个人在设计决策中保持自由 - 阅读原始设计动机总是有助于理解原作中的性能和安全见解)。
我正在为我的项目使用 jzmq
包来通过网络进行通信。我正在使用 DEALER ROUTER
对。我读过 DEALER
和 ROUTER
类型 的套接字不是线程安全的 。所以我不能在 2 个不同的线程上从同一个套接字发送或接收。
我的问题是:
1)jzmq包中ZThread
class的作用是什么?
2 ) 它是否处理这个线程不安全?
3 ) 如果从父线程及其子线程使用它,我可以从同一个套接字发送和接收吗?ZThread
?
4 ) 另外 Attached
和 AdetachedRunnable
有什么区别?
事实 #0:ZeroMQ 从来没有 thread-safe(零共享 Zen)
尽管最近做出了努力(于 2017 年末发表了 4.2+ 总 re-design 努力来消除这个已知的初始原则),但尽可能提供 ZeroMQ 教育材料并解释为什么有一个坏习惯尝试在 distributed-system 设计实践中分享玩具。
广告 2)
即使有人得到一些 API-baked 承诺,如果有人愿意为这种 ex-post 共享原则付出性能损失的代价,始终首先要对性能进行基准测试。正如关于 ZeroMQ 本机 API 所指出的那样,基本上没有什么可以共享的(除了一个例外,有时可能有意义,即全局 Context()-instance)。线程可以 "borrow" 来自这样一个全局 Context() 实例的 IO-socket 实例化,但永远不会共享 socket-instances,因为在 ZeroMQ 本机 API 内部和之下无法保证结果所以即使承诺也不会更好 "above" 任何更高级别 API.
广告 3) 否,
根据 2 ),从不共享套接字,没有理由尝试这样做。如果管理资源(并且线程是 first-class 资源中的公民),最好在 { inproc:// | ipc:// }
上创建一个私有的、点对点的 PAIR/PAIR
或 PUSH/PULL
(即使是串联的单工管道) -transport-class(其中 inproc://
可以针对性能驱动的情况甚至使用另一个 "co-locally-isolated" 私有 Context(0)
-实例,实际上 IO-threads 完全为零)并享受应有的待遇分离关注点,对主要损失的 thread-safety(如果不这样做)和性能产生最小的不利影响。
广告 1 + 4)
( CZMQ/3.0.1 API docs )
zthread
- working with system threads (deprecated)
...
Thezthread
class wraps OS thread creation. It creates detached threads that look like normal OS threads, or attached threads that share the caller's ØMQ context, and get aninproc
pipe to talk back to the parent thread. Detached threads create their own ØMQ contexts as needed. NOTE: this class is deprecated in favor ofzactor
.
最好检查一下本机 API 使用的版本、绑定/包装器版本和文档。
然而,零共享 Zen 可能会引领您的脚步(如果选择的语言绑定允许一个人在设计决策中保持自由 - 阅读原始设计动机总是有助于理解原作中的性能和安全见解)。