本文作者为:telppa 链接:https://github.com/telppa/ahkzmq
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次回应。
dbgba - V1和V2版的优化兼容性打包下载:
以下代码存为 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 过程中对部分概念的理解与经验。
学习是自己的事情,本文不会手把手的教授任何功能,你应该去看示例或指南或概念或百度。
建议的学习路径
- 入门示例。
- 官方指南。
- 进阶示例(即官方指南中的示例)。
- 百度并思考。
下载地址
示例及库:https://github.com/telppa/ahkzmq
评论(0)