3

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

我的解决方案是有一个单独的线程(而不是线程池),所有数据库工作都在其中发生,并且只要主线程还活着,它就会运行。我想我知道如何通过通道传递消息来做到这一点,但这需要相当多的样板代码(例如,通过通道显式发送函数参数等)。

有没有一种更直接的方法可以用 rust 实现这样的事情(可能还有 tokio 和 nightly 中的新 async/await 表示法)?

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

let handle = spawn_thread_with_runtime(...);

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

wherequery_function将是一个立即返回未来并在另一个线程上完成工作的函数。

Rust nightly 和外部 crates / 宏就可以了。

4

1 回答 1

1

如果可以选择外部 crates,我会考虑看一下actix,这是 Rust 的 Actor 框架。

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

它负责处理更高级别的消息传递、生成等的大部分样板。

actix 文档中还有一个Diesel 示例,听起来非常接近您的用例。

于 2018-11-12T11:11:46.707 回答