Chapter 2 - Sockets and Patterns【选译,哈哈】 Part 6 Multithreading with ZeroMQ
Multithreading with ZeroMQ
你应该遵循一些规则,以编写愉快的多线程代码ZeroMQ:
在线程中单独隔离数据,不要在多个线程中共享数据。唯一的例外是ZeroMQ上下文,它是线程安全的。
不要使用互斥、临界区、信号量等经典并发机制。这些是ZeroMQ应用程序中的一个反模式。
在进程开始时创建一个ZeroMQ上下文,并将其传递给希望通过inproc套接字连接的所有线程。
使用附加线程在应用程序中创建结构,并在inproc上使用PAIR套接字将这些线程连接到它们的父线程。模式是:绑定父套接字,然后创建连接其套接字的子线程。
使用分离的线程来模拟独立的任务,以及它们自己的上下文。通过tcp连接这些。稍后,您可以将它们移动到独立的进程中,而无需显著更改代码。
线程之间的所有交互都以ZeroMQ消息的形式发生,您可以或多或少地正式定义它。
不要在线程之间共享ZeroMQ套接字。ZeroMQ套接字不是线程安全的。从技术上讲,可以将套接字从一个线程迁移到另一个线程,但这需要技巧。线程之间共享套接字的唯一合理的地方是语言绑定,它需要对套接字进行垃圾收集之类的神奇操作。
例如,如果您需要在一个应用程序中启动多个代理,您将希望在它们各自的线程中运行它们。很容易犯这样的错误:在一个线程中创建代理前端和后端套接字,然后将套接字传递给另一个线程中的代理。这在一开始看起来是可行的,但在实际使用中却会随机失败。记住:不要使用或关闭套接字,除非在创建它们的线程中。
让我们看看这在实践中是如何工作的。我们将把旧的Hello World服务器变得更强大。原始服务器在单个线程中运行。如果每个请求的工作量很低,那也没关系:一个ØMQ线程可以在CPU核心上全速运行,不需要等待,做大量的工作。但是实际的服务器必须对每个请求做一些重要的工作。当10,000个客户机同时访问服务器时,单个核心可能不够。因此,一个实际的服务器将启动多个工作线程。然后,它尽可能快地接受请求,并将这些请求分发给它的工作线程。工作线程不断地完成工作,并最终发送他们的回复。
现在你应该可以识别所有的代码了。它是如何工作的:
服务器创建一个ROUTER套接字来与客户端通信,并将其绑定到外部接口(通过tcp)。
服务器创建一个DEALER套接字来与worker通信,并将其绑定到其内部接口(通过inproc)。
服务器启动连接两个套接字的代理。代理公平地从所有客户端获取传入请求,并将这些请求分发给工作人员。它还会将回复发送回原处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义