ZeroMQ 是什么?
简单说,它是一个通用消息传递库,可以用简洁的代码在不同媒介间传输信息,例如线程间、进程间、不同编程语言间、不同操作系统间、不同的网络环境间等等。
它可以传递任何形式的信息,例如数字、文字、二进制等,并且没有大小限制。
它模式多样,常用的有 请求/回复、发布/订阅、推送/拉取等,可轻松实现 1对1、1对多、多对多等各式传输。
它非常高效, AHK 版本在 R7 5800H 处理器上,推送/拉取模式下,10字节大小的信息每秒可发送约82.3w条。
速度大概是 SendMessage 的10+倍(后者通常还只能传输数字)。
其 C 语言版本速度则更快,预估是 AHK 版本的10+倍。
它能做什么?
因为它可以连接一切,所以简单的设想就有很多可能性。
比如多线程或多进程间的通信。
比如用 AHK 给编辑器 SciTE 写扩展(原理是在官方扩展语言 Lua 中用 ZeroMQ 将事件与变量转发给 AHK )。同理,其它编辑器例如 Sublime Text 也是一样。
比如做一个新闻或天气更新服务,有10000个用户同时订阅更新。
还可以实现一个分布式计算程序,再或者写一个聊天软件也不再遥不可及。
一切都只限于想象力。
更多关于它能做什么的灵感,强烈推荐阅读官方指南的第一章、第一节 —— “Fixing the World”。
这里还有一份比较老的中文版 —— “Fixing the World(中文版)”。
简单的示例
下面是一个简单的例子,演示客户端发送10000次消息给服务端,同时从服务端接收10000次回应。
以下代码存为 client.ahk
; Hello World 示例 - 客户端
#NoEnv
SetBatchLines -1 ; 速度最大化
zmq := new ZeroMQ ; 初始化 ZeroMQ
context := zmq.context() ; 创建一个上下文
socket := context.socket(zmq.REQ) ; 创建一个 REQ 套接字
socket.connect("tcp://localhost:5555") ; 连接到端口
loop 10000
{
socket.send_string("Hello") ; 发送10000次消息(Hello)给服务端
message := socket.recv_string() ; 同时从服务端接收10000次回应
}
MsgBox Client received reply %message%
ExitApp
#Include ZeroMQ.ahk
以下代码存为 server.ahk
; Hello World 示例 - 服务端
#NoEnv
SetBatchLines -1 ; 速度最大化
zmq := new ZeroMQ
context := zmq.context()
socket := context.socket(zmq.REP) ; 创建一个 REP 套接字
socket.bind("tcp://*:5555") ; 绑定到端口
loop 10000
{
message := socket.recv_string()
socket.send_string("World")
}
ExitApp
#Include ZeroMQ.ahk
然后运行上面两份代码吧。
注意,无论你先运行 client.ahk 还是 server.ahk ,程序都是可以正常工作的。
感受到它的强大了吧。
本文的使命
我将尝试为 AHK 完整封装 ZeroMQ 的全部功能,并实现最新官方指南中的所有示例。
目前大部分功能都封装完成了,尤其是最常用的基本功能。
本文会提供库及示例的下载地址。
本文会更新一些我学习 ZeroMQ 过程中对部分概念的理解与经验。
学习是自己的事情,本文不会手把手的教授任何功能,你应该去看示例或指南或概念或百度。
建议的学习路径
- 入门示例。
- 官方指南。
- 进阶示例(即官方指南中的示例)。
- 百度并思考。
用标题替换引用效果会更好
大佬威武,一年前就深入研究了,拜读!