#channel #crossbeam #response #request #thread #request-receiver #request-sender

crossbeam_requests

Crossbeam 通道,但带有响应功能

2 个不稳定版本

0.3.0 2019年8月27日
0.2.0 2019年4月18日

#13 in #crossbeam

每月下载 22

MPL-2.0 许可证

9KB
97

crossbeam_requests

test

更多信息请参阅上方的文档

待办事项

  • 重命名回 mpsc_requests?crossbeam-requests 名称不具描述性,且 mpsc_request 名称较低级。
  • 更好的错误处理

lib.rs:

mpsc_requests 重新编写以供 crossbeam 使用,由 @stjepang 编写(https://github.com/crossbeam-rs/crossbeam/issues/353#issuecomment-484013974

crossbeam_requests 是一个小型库,建立在 crossbeam-channel 之上,但增加了消费者向生产者响应消息的功能。由于生产者不再只负责生产,消费者也不再只负责消费,因此将生产者重命名为 [RequestSender],将消费者重命名为 [RequestReceiver]。

此库基于 crossbeam-requests 而不是标准库中的 mpsc 通道,因为 crossbeam 具有更好的性能和更好的与 Android 的兼容性。

此库的一个完美用例是单线程数据库,需要从多个线程访问(例如 SQLite)

以下是数据流图

|--------------------------------------------------------------------------------------| | 线程 | 请求线程 | 响应线程 | 请求线程 | |--------------------------------------------------------------------------------------| | 结构 | RequestSender -> RequestReceiver -> ResponseSender -> ResponseReceiver | | (方法) | (请求) -> (轮询、轮询循环) -> (响应) -> (收集) | |--------------------------------------------------------------------------------------|

示例

更多示例,请参阅示例目录

更多示例,请参阅测试目录中的测试

简单的回显示例

use std::thread;
use crossbeam_requests::channel;

type RequestType = String;
type ResponseType = String;
let (requester, responder) = channel::<RequestType, ResponseType>();
thread::spawn(move || {
    responder.poll_loop(|req, res_sender| {
        res_sender.respond(req);
    });
});
let msg = String::from("Hello");
let receiver = requester.request(msg.clone()).unwrap();
let res = receiver.collect().unwrap();
assert_eq!(res, msg);

依赖项

~395KB