#tokio-task #object #single

tokio-lock

从单个Tokio任务中访问对象

5个版本 (3个稳定版本)

1.1.0 2019年2月17日
1.0.1 2019年2月17日
0.2.0-dev2019年2月17日
0.1.0-dev2019年2月17日

#1245 in 异步

MIT 许可证

11KB
191 代码行

tokio-lock

Build Status Latest version Documentation License

从单个Tokio任务中访问对象。

为什么?

Tokio futures 在多线程环境中运行,这使得从不同的 futures 访问对象变得复杂。然而,在许多情况下,对象不是线程安全的,必须从单个线程访问。

例如,想象编写一个RPC服务器的HTTP包装器。很可能会使用 MPSC(多生产者单消费者)队列和可能的消息的大枚举,或者使用互斥锁来保护对象的访问。

此库在 MPSC 之上创建了一个方便的抽象,该抽象由内部管理。

快速示例

extern crate futures;
extern crate tokio;
extern crate tokio_lock;

use futures::prelude::*;
use futures::future::{self, FutureResult};

use tokio_lock::{Lock, Error};

// Create a Lock instance
let mut lock = Lock::new();

struct TestObject {
    field: u32,
}

// Create a future that is going to manage the `TestObject` instance.
// NOTE: Object is consumed in the process.
let manage = lock.manage(TestObject { field: 42 });

// Borrow an object from `lock` and execute given closure.
let get_field = lock.get(|obj| -> FutureResult<u32, Error> {
    future::ok(obj.field)
}).map(move |field| {
    assert_eq!(field, 42);

    // Stop managing the object
    // NOTE: This may not be needed in the most of the cases.
    lock.stop();
});

// NOTE: `manage` is a future and has to be run
tokio::run(manage.join(get_field).map_err(|err| {
    panic!("Got error");
}).map(|_| ()));

使用 tokio-lock

请查看我们的文档以获取详细信息。

依赖项

~3MB
~45K SLoC