4个版本
使用旧的Rust 2015
0.1.0 | 2016年12月10日 |
---|---|
0.0.3 | 2016年6月21日 |
0.0.2 | 2016年5月11日 |
0.0.1 | 2016年3月27日 |
#18 in #exists
在5个crate中使用(通过czmq)
1MB
20K 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()
之后,从子线程中调用是安全的,但在之前,除非你喜欢panic,否则请避免在多个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 fns替换FFI存根来完成现有模块
- 解决ZSock::send/recv的变长函数问题 - 将Rust的类型系统与C的void指针结合是困难的
- 在Rust中重现CZMQ示例
- 库的文档
- 继续全面支持库的痛苦追求
谢谢
向Andrew Hobden表示敬意,感谢他的教程,关于自动将Rust文档发布到GitHub Pages!
这个库受到了erickt的Rust ZMQ绑定的启发。