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

推荐订阅源

Attack and Defense Labs
Attack and Defense Labs
The GitHub Blog
The GitHub Blog
C
Check Point Blog
博客园_首页
MongoDB | Blog
MongoDB | Blog
N
Netflix TechBlog - Medium
F
Full Disclosure
Microsoft Security Blog
Microsoft Security Blog
爱范儿
爱范儿
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
G
GRAHAM CLULEY
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Threat Research - Cisco Blogs
C
Cybersecurity and Infrastructure Security Agency CISA
V
Vulnerabilities – Threatpost
K
Kaspersky official blog
博客园 - 司徒正美
S
Schneier on Security
T
The Exploit Database - CXSecurity.com
Project Zero
Project Zero
云风的 BLOG
云风的 BLOG
Cisco Talos Blog
Cisco Talos Blog
Know Your Adversary
Know Your Adversary
雷峰网
雷峰网
V
V2EX - 技术
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Spread Privacy
Spread Privacy
罗磊的独立博客
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
S
Security Affairs
SecWiki News
SecWiki News
Schneier on Security
Schneier on Security
O
OpenAI News
Jina AI
Jina AI
PCI Perspectives
PCI Perspectives
Cyberwarzone
Cyberwarzone
Y
Y Combinator Blog
Apple Machine Learning Research
Apple Machine Learning Research
B
Blog RSS Feed
I
InfoQ
D
Docker
P
Palo Alto Networks Blog
Recorded Future
Recorded Future
M
MIT News - Artificial intelligence
博客园 - Franky
B
Blog
Scott Helme
Scott Helme
博客园 - 叶小钗
D
DataBreaches.Net

博客园 - 水色天空

用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 Multithreading with ZeroMQ
水色天空 · 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)。 

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