惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
爱范儿
爱范儿
V
Visual Studio Blog
Engineering at Meta
Engineering at Meta
B
Blog
云风的 BLOG
云风的 BLOG
G
Google Developers Blog
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
U
Unit 42
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
WordPress大学
WordPress大学
D
DataBreaches.Net
B
Blog RSS Feed
小众软件
小众软件
人人都是产品经理
人人都是产品经理
I
InfoQ
P
Proofpoint News Feed
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
The GitHub Blog
The GitHub Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

博客园 - 水色天空

用docfx生成c#项目API的简洁教程 wpf datagrid鼠标穿透 OxyPloot设置X轴时间DateTimeAxis WPF中MVVM模式下ComboBox绑定,无法更新selectedItem的解决方案 WPF设置DatePicker日期格式之卡Bug大法 WPF程序自动重启 InstallShield打包.net项目无法包含数据库、配置文件等 handycontrol中NumericUpDown无法显示自定义错误提示的解决办法 DataGrid代码生成列居中问题 Chapter 2 - Sockets and Patterns【选译,哈哈】 Part 9 High-Water Marks Chapter 2 - Sockets and Patterns【选译,哈哈】 Part 9 Missing Message Problem Solver Chapter 2 - Sockets and Patterns【选译,哈哈】 Part 9 Zero-Copy Chapter 2 - Sockets and Patterns【选译,哈哈】 Part 8 Node Coordination Chapter 2 - Sockets and Patterns【选译,哈哈】 Part 7 Signaling Between Threads (PAIR Sockets) Chapter 2 - Sockets and Patterns【选译,哈哈】 Part 5 Handling Interrupt Signals WPF绑定RadioButton的标准做法 解决.net reactor加密后的dll,在其它电脑无法运行的问题 函数返回值的一些规则 Chapter 2 - Sockets and Patterns【选译,哈哈】 Part 4 Handling Errors and ETERM
Chapter 2 - Sockets and Patterns【选译,哈哈】 Part 6 Mul...
水色天空 · 2021-09-24 · via 博客园 - 水色天空

Multithreading with ZeroMQ

你应该遵循一些规则,以编写愉快的多线程代码ZeroMQ:

在线程中单独隔离数据,不要在多个线程中共享数据。唯一的例外是ZeroMQ上下文,它是线程安全的。

不要使用互斥、临界区、信号量等经典并发机制。这些是ZeroMQ应用程序中的一个反模式。

在进程开始时创建一个ZeroMQ上下文,并将其传递给希望通过inproc套接字连接的所有线程。

使用附加线程在应用程序中创建结构,并在inproc上使用PAIR套接字将这些线程连接到它们的父线程。模式是:绑定父套接字,然后创建连接其套接字的子线程。

使用分离的线程来模拟独立的任务,以及它们自己的上下文。通过tcp连接这些。稍后,您可以将它们移动到独立的进程中,而无需显著更改代码。

线程之间的所有交互都以ZeroMQ消息的形式发生,您可以或多或少地正式定义它。

不要在线程之间共享ZeroMQ套接字。ZeroMQ套接字不是线程安全的。从技术上讲,可以将套接字从一个线程迁移到另一个线程,但这需要技巧。线程之间共享套接字的唯一合理的地方是语言绑定,它需要对套接字进行垃圾收集之类的神奇操作。

例如,如果您需要在一个应用程序中启动多个代理,您将希望在它们各自的线程中运行它们。很容易犯这样的错误:在一个线程中创建代理前端和后端套接字,然后将套接字传递给另一个线程中的代理。这在一开始看起来是可行的,但在实际使用中却会随机失败。记住:不要使用或关闭套接字,除非在创建它们的线程中。

让我们看看这在实践中是如何工作的。我们将把旧的Hello World服务器变得更强大。原始服务器在单个线程中运行。如果每个请求的工作量很低,那也没关系:一个ØMQ线程可以在CPU核心上全速运行,不需要等待,做大量的工作。但是实际的服务器必须对每个请求做一些重要的工作。当10,000个客户机同时访问服务器时,单个核心可能不够。因此,一个实际的服务器将启动多个工作线程。然后,它尽可能快地接受请求,并将这些请求分发给它的工作线程。工作线程不断地完成工作,并最终发送他们的回复。

现在你应该可以识别所有的代码了。它是如何工作的:

 

服务器启动一组工作线程。每个工作线程创建一个REP套接字,然后在这个套接字上处理请求。工作线程就像单线程服务器。唯一的区别是传输(inproc而不是tcp)和绑定连接方向。 

服务器创建一个ROUTER套接字来与客户端通信,并将其绑定到外部接口(通过tcp)。 

服务器创建一个DEALER套接字来与worker通信,并将其绑定到其内部接口(通过inproc)。 

服务器启动连接两个套接字的代理。代理公平地从所有客户端获取传入请求,并将这些请求分发给工作人员。它还会将回复发送回原处。