#async-context #run-time #blocking #sync #values #operating #thread

asyncified

一个用于在异步上下文中操作长时间生存的同步值的库

9个版本 (5个重大更新)

0.6.2 2023年9月12日
0.6.1 2023年8月30日
0.5.0 2023年5月6日
0.4.0 2023年5月1日
0.1.0 2023年4月29日

#453 in 异步

Download history 27/week @ 2024-03-11 8/week @ 2024-03-18 11/week @ 2024-03-25 33/week @ 2024-04-01 25/week @ 2024-04-08 80/week @ 2024-04-15 51/week @ 2024-04-22 137/week @ 2024-04-29 135/week @ 2024-05-06 160/week @ 2024-05-13 8/week @ 2024-05-20 56/week @ 2024-06-03 9/week @ 2024-06-10 14/week @ 2024-06-17 11/week @ 2024-06-24

每月下载量 90
2 个crate中使用(通过async-rusqlite

MIT 许可证

20KB
371

Asyncified

一个小巧、无依赖、运行时无关的Rust库,用于将需要在一个阻塞线程中操作的东西,使其在异步上下文中多个任务中可用。

use asyncified::Asyncified;

// We can construct some blocking thing in a new thread:
let async_conn = Asyncified::new(|| database::connection());

// And then we can run blocking code which is handed a mutable reference
// to this thing, and await the result in a non-blocking way from our
// async context:
let res = async_conn.call(|db_conn| {
    let res = db_conn.execute("SELECT * FROM foo");
    res
}).await;

调用 Asyncified::new() 为该值创建一个新的线程。该线程将保持活跃,直到所有的 Asyncified 实例被丢弃。使用 .call() 将函数调度到这个新线程,在阻塞上下文中按顺序运行。

传递给 Asyncified::new() 的值必须为 Send + 'static 才能发送到这个新线程,但不需要为 Sync,因为它只在这个线程上访问。

警告:用于从同步线程发送函数并接收结果的通道实现是原始的。在快速测试中,更新值并返回所需的时间在几个微秒的量级,所以对于目前的需求来说已经足够好了,因为它预计会与数据库连接等东西一起使用,这些将会使这种开销显得微不足道。

无运行时依赖