|
| 1 | +{ |
| 2 | + "cells": [ |
| 3 | + { |
| 4 | + "cell_type": "markdown", |
| 5 | + "id": "b89d17d2", |
| 6 | + "metadata": {}, |
| 7 | + "source": [ |
| 8 | + "# 开始使用 ZeroMQ" |
| 9 | + ] |
| 10 | + }, |
| 11 | + { |
| 12 | + "cell_type": "markdown", |
| 13 | + "id": "108eede3", |
| 14 | + "metadata": {}, |
| 15 | + "source": [ |
| 16 | + "ZeroMQ(也拼写为 ØMQ、0MQ 或 ZMQ)是高性能异步消息传递库,旨在用于分布式或并发应用程序。它提供了一个消息队列,但与面向消息的中间件不同,ZeroMQ 系统可以在没有专用消息代理的情况下运行。\n", |
| 17 | + "\n", |
| 18 | + "ZeroMQ 支持通过各种传输(TCP、进程内、进程间、multicast、WebSocket 等)的常见消息传递模式(发布/订阅、请求/回复、客户端/服务器等),使进程间消息传递像线程间消息传递一样简单。这使您的代码保持清晰、模块化且极其易于扩展。\n", |
| 19 | + "\n", |
| 20 | + "ZeroMQ 是由庞大的贡献者社区开发的。许多流行的编程语言都有第三方绑定,C# 和 Java 也有本机端口。\n", |
| 21 | + "\n", |
| 22 | + "```{admonition} ZeroMQ 中的零\n", |
| 23 | + "ZeroMQ 的理念从零开始。零表示零代理(ZeroMQ 是无代理)、零延迟、零成本(免费)和零管理。\n", |
| 24 | + "\n", |
| 25 | + "更一般地说,“零”是指渗透到项目中的极简主义文化。通过消除复杂性而不是通过公开新功能来增加功能。\n", |
| 26 | + "```" |
| 27 | + ] |
| 28 | + }, |
| 29 | + { |
| 30 | + "cell_type": "markdown", |
| 31 | + "id": "b22c6bf4", |
| 32 | + "metadata": {}, |
| 33 | + "source": [ |
| 34 | + "[指南](http://zguide.zeromq.org/page:all)解释了如何使用 ØMQ,涵盖了基础、中级和高级使用,包括 60+ 图表和 750 个示例,包括 28 种语言。\n" |
| 35 | + ] |
| 36 | + }, |
| 37 | + { |
| 38 | + "cell_type": "markdown", |
| 39 | + "id": "b07876d3", |
| 40 | + "metadata": {}, |
| 41 | + "source": [ |
| 42 | + "```{admonition} 用一百个字描述 ZeroMQ\n", |
| 43 | + "ZeroMQ(也称为ØMQ、0MQ 或 zmq)看起来像是可嵌入的网络库,但实际上是并发框架。它为您提供可以在进程内、进程间、TCP 和多播等不同传输方式上携带原子消息的套接字。您可以使用类似 fan-out、pub-sub、任务分配和请求-回复的模式将套接字 N 对 N 地连接起来。它足够快,可以成为集群产品的架构。其异步 I/O 模型让您能够构建可扩展的多核应用程序,这些应用程序作为异步消息处理任务。它拥有多种语言 API,并在大多数操作系统上运行。ZeroMQ 来自 [iMatix](http://www.imatix.com/),是 LGPLv3 开源项目。\n", |
| 44 | + "```" |
| 45 | + ] |
| 46 | + }, |
| 47 | + { |
| 48 | + "cell_type": "markdown", |
| 49 | + "id": "48093bb8", |
| 50 | + "metadata": {}, |
| 51 | + "source": [ |
| 52 | + "## 第一个 Python 例子\n", |
| 53 | + "\n", |
| 54 | + "安装\n", |
| 55 | + "```bash\n", |
| 56 | + "pip install pyzmq\n", |
| 57 | + "```\n" |
| 58 | + ] |
| 59 | + }, |
| 60 | + { |
| 61 | + "cell_type": "markdown", |
| 62 | + "id": "bc385bff", |
| 63 | + "metadata": {}, |
| 64 | + "source": [ |
| 65 | + "```python\n", |
| 66 | + "#\n", |
| 67 | + "# Hello World server in Python\n", |
| 68 | + "# Binds REP socket to tcp://*:5555\n", |
| 69 | + "# Expects b\"Hello\" from client, replies with b\"World\"\n", |
| 70 | + "#\n", |
| 71 | + "\n", |
| 72 | + "import time\n", |
| 73 | + "import zmq\n", |
| 74 | + "\n", |
| 75 | + "context = zmq.Context()\n", |
| 76 | + "socket = context.socket(zmq.REP)\n", |
| 77 | + "socket.bind(\"tcp://*:5555\")\n", |
| 78 | + "\n", |
| 79 | + "while True:\n", |
| 80 | + " # Wait for next request from client\n", |
| 81 | + " message = socket.recv()\n", |
| 82 | + " print(f\"Received request: {message}\")\n", |
| 83 | + "\n", |
| 84 | + " # Do some 'work'\n", |
| 85 | + " time.sleep(1)\n", |
| 86 | + "\n", |
| 87 | + " # Send reply back to client\n", |
| 88 | + " socket.send(b\"World\")\n", |
| 89 | + "````" |
| 90 | + ] |
| 91 | + }, |
| 92 | + { |
| 93 | + "cell_type": "markdown", |
| 94 | + "id": "30ed2018", |
| 95 | + "metadata": {}, |
| 96 | + "source": [ |
| 97 | + "服务器创建 response 类型的套接字,将其绑定到端口 5555,然后等待消息。您还可以看到配置为零,只是在发送字符串。\n", |
| 98 | + "\n", |
| 99 | + "```python\n", |
| 100 | + "#\n", |
| 101 | + "# Hello World client in Python\n", |
| 102 | + "# Connects REQ socket to tcp://localhost:5555\n", |
| 103 | + "# Sends \"Hello\" to server, expects \"World\" back\n", |
| 104 | + "#\n", |
| 105 | + "\n", |
| 106 | + "import zmq\n", |
| 107 | + "\n", |
| 108 | + "context = zmq.Context()\n", |
| 109 | + "\n", |
| 110 | + "# Socket to talk to server\n", |
| 111 | + "print(\"Connecting to hello world server…\")\n", |
| 112 | + "socket = context.socket(zmq.REQ)\n", |
| 113 | + "socket.connect(\"tcp://localhost:5555\")\n", |
| 114 | + "\n", |
| 115 | + "# Do 10 requests, waiting each time for a response\n", |
| 116 | + "for request in range(10):\n", |
| 117 | + " print(f\"Sending request {request} …\")\n", |
| 118 | + " socket.send(b\"Hello\")\n", |
| 119 | + "\n", |
| 120 | + " # Get the reply.\n", |
| 121 | + " message = socket.recv()\n", |
| 122 | + " print(f\"Received reply {request} [ {message} ]\")\n", |
| 123 | + "```" |
| 124 | + ] |
| 125 | + }, |
| 126 | + { |
| 127 | + "cell_type": "markdown", |
| 128 | + "id": "36863dfe", |
| 129 | + "metadata": {}, |
| 130 | + "source": [ |
| 131 | + "客户端创建 request 类型的套接字,连接并开始发送消息。\n", |
| 132 | + "\n", |
| 133 | + "默认情况下, 发送和接收方法都处于阻塞状态。对于接收很简单:如果没有消息,该方法将阻塞。对于发送,它更复杂,取决于 socket 类型。对于请求套接字,如果达到高水位线或未连接对等方,则该方法将阻塞。" |
| 134 | + ] |
| 135 | + } |
| 136 | + ], |
| 137 | + "metadata": { |
| 138 | + "language_info": { |
| 139 | + "name": "python" |
| 140 | + } |
| 141 | + }, |
| 142 | + "nbformat": 4, |
| 143 | + "nbformat_minor": 5 |
| 144 | +} |
0 commit comments