1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2016年12月10日 |
---|
在#zeromq 中排名 22
在 4 个crate中使用
140KB
3K SLoC
rust-czmq
Rust 对 CZMQ 的绑定。文档可以在 https://petehayes102.github.io/rust-czmq 找到。
注意,这个库的大部分功能尚未完成。对于现有的模块,你可以找到如下注释
来自 src/zmsg.rs
// pub fn zmsg_sendm(self_p: *mut *mut zmsg_t,
// dest: *mut ::std::os::raw::c_void)
// -> ::std::os::raw::c_int;
这是 C 库的 FFI 包装器,我将其用作 Rust fn 的占位符。虽然 CZMQ 是一个庞大的库,但我还是会继续努力。总之,欢迎提交PR! :D
CZMQ
CZMQ 是 ZeroMQ 的高级 C 绑定,它为复杂任务提供了有用的抽象,以及你通常需要自己编写的许多模板代码。
更多信息可以在 https://czmq.zeromq.org 找到。
多线程
CZMQ 的 ZSock 结构在多线程中特别有用,因为 CZMQ 维护了一个内部的全局状态来共享单个上下文对象。这意味着你可以在线程之间实例化新的 ZSock 而不必显式共享上下文。
注意事项
请注意,我并不是建议你在线程之间共享单个 ZSock。这是非常不安全的 :)
此外,请注意,每次调用 ZSock 都会触发对 C fn 的调用 zsys_init()
,它 不是线程安全的!在第一次调用 zsys_init()
之后,从子线程调用是安全的,但在之前,除非你喜欢恐慌,否则请避免在多个 ZSock 实例化之间创建竞争条件。
缓解此问题的最简单方法是在创建子线程之前在你的主线程中创建一个 ZSock(你可能会这样做),这将无竞争地调用 zsys_init()
并安全地初始化全局 ZSys 状态。
对于无法控制主线程的情况(例如测试),你可以遵循我在此库中使用的示例来运行安全的测试
来自 src/lib.rs
#[cfg(test)]
use std::sync::{Once, ONCE_INIT};
#[cfg(test)]
static INIT_ZSYS: Once = ONCE_INIT;
#[cfg(test)]
fn zsys_init() {
INIT_ZSYS.call_once(|| {
unsafe { czmq_sys::zsys_init() };
});
}
然后在你的测试中(或你想要保护 ZSock::new() 调用的任何地方)
#[test]
fn test_my_thing() {
zsys_init();
// Now go nuts...
}
Bindgen
要生成 FFI 代码(czmq-sys/src/ffi.rs),你需要 rust-bindgen。克隆并构建此仓库,然后使用它来生成绑定。
以下是一个示例命令
/path/to/bindgen -l czmq -o /path/to/rust-czmq/czmq-sys/src/ffi.rs -builtins /path/to/rust-czmq/czmq-sys/bindgen.h
对于OS X,我们可能还需要帮助Clang找到一些缺失的头文件。如果你看到如下错误...
/usr/local/include/czmq_prelude.h:177:13: fatal error: 'TargetConditionals.h' file not found
...那么你可能需要手动指定包含缺失头文件的目录(或多个目录)。
注意:你需要安装Xcode来获取缺失的头文件。
以下是一个包含缺失头文件包含路径的示例命令
/path/to/bindgen -l czmq -o /path/to/rust-czmq/czmq-sys/src/ffi.rs -builtins -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/ /path/to/rust-czmq/czmq-sys/bindgen.h
如果上面的路径不存在(可能不存在),或者你仍然收到关于缺失头文件(.h文件)的错误,请使用find
在您的机器上查找头文件。找到它们后,请像上面示例中那样,使用一个或多个-I
标志手动指定它们的路径。
如果你仍然有困难,请随时提出工单,也许有人能给你正确的方向。
路线图
- 通过用Rust fn替换FFI存根来完成现有模块
- 解决ZSock::send/recv的变长函数问题 - 将Rust的类型系统与C的空指针结合起来是困难的
- 在Rust中重现CZMQ示例
- 库的文档
- 继续追求全面支持库的痛苦追求
谢谢
向Andrew Hobden表示敬意,他为教程关于自动发布Rust文档到GitHub Pages!
这个库受到了erickt的Rust ZMQ绑定的启发。
依赖关系
290–400KB