在特定线程中运行异步功能

时间:2018-11-12 10:59:15

标签: async-await rust rust-tokio

我想在单独的线程上运行特定的长时间运行的函数(执行数据库查询)。但是,我们假设底层数据库引擎一次只允许一个连接,而连接结构不是Sync(我认为至少对于diesel来说是正确的)。

我的解决方案是只有一个单独的线程(而不是线程池),所有数据库工作都在该线程中进行,并且只要主线程处于活动状态就可以运行。 我想我知道如何通过通道传递消息来做到这一点,但这需要一些样板代码(例如,通过通道显式发送函数自变量等)。

是否有一种更直接的方法来实现生锈(可能还有夜间使用的tokio和夜间使用的新异步/等待符号)?

我希望按照以下方式做些事情:

let handle = spawn_thread_with_runtime(...);

let future = run_on_thread!(handle, query_function, argument1, argument2);

其中query_function是立即返回future并在另一个线程上完成工作的函数。

每天晚上和外部板条箱/宏都可以。

1 个答案:

答案 0 :(得分:1)

如果可以选择使用外部包装箱,我考虑考虑使用actix,这是Rust的Actor框架。

这将使您在一个单独的线程中产生一个Actor,该线程有效地拥有与数据库的连接。然后,它可以侦听消息,根据这些消息执行工作/查询,并返回同步结果或将来的消息。

它会在更高级别上处理大部分样板,以进行消息传递,生成等。

actix文档中还有一个Diesel example,听起来很接近您所想到的用例。