Chapter 2

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)。 

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

原文地址:https://www.cnblogs.com/usen521/p/15328774.html