运行 特定线程中的异步函数
Run async function in specific thread
我想在单独的线程上 运行 特定的 long-运行ning 函数(执行数据库查询)。但是,我们假设底层数据库引擎一次只允许一个连接并且连接结构不是 Sync
(我认为至少后者对于 diesel
是正确的)。
我的解决方案是拥有一个单独的线程(与线程池相对),其中发生所有数据库工作,并且 运行 只要主线程处于活动状态。
我想我知道如何通过通道传递消息来做到这一点,但这需要相当多的样板代码(例如,通过通道显式发送函数参数等)。
有没有更直接的方法可以用 rust(可能还有 tokio 和 nightly 中的新 async/await 表示法)实现这样的东西?
我希望按照以下方式做一些事情:
let handle = spawn_thread_with_runtime(...);
let future = run_on_thread!(handle, query_function, argument1, argument2);
其中 query_function
将是一个立即 returns 未来并在另一个线程上完成工作的函数。
Rust nightly 和外部板条箱/宏都可以。
如果可以选择外部 crate,我会考虑看一下 actix,一个 Rust 的 Actor 框架。
这将让您在一个单独的线程中生成一个 Actor,该线程有效地拥有与 DB 的连接。然后它可以侦听消息,根据这些消息执行 work/queries,并且 return 同步结果或期货。
它在更高级别处理消息传递、生成等的大部分样板文件。
actix 文档中还有一个 Diesel example,这听起来与您想到的用例非常接近。
我想在单独的线程上 运行 特定的 long-运行ning 函数(执行数据库查询)。但是,我们假设底层数据库引擎一次只允许一个连接并且连接结构不是 Sync
(我认为至少后者对于 diesel
是正确的)。
我的解决方案是拥有一个单独的线程(与线程池相对),其中发生所有数据库工作,并且 运行 只要主线程处于活动状态。 我想我知道如何通过通道传递消息来做到这一点,但这需要相当多的样板代码(例如,通过通道显式发送函数参数等)。
有没有更直接的方法可以用 rust(可能还有 tokio 和 nightly 中的新 async/await 表示法)实现这样的东西?
我希望按照以下方式做一些事情:
let handle = spawn_thread_with_runtime(...);
let future = run_on_thread!(handle, query_function, argument1, argument2);
其中 query_function
将是一个立即 returns 未来并在另一个线程上完成工作的函数。
Rust nightly 和外部板条箱/宏都可以。
如果可以选择外部 crate,我会考虑看一下 actix,一个 Rust 的 Actor 框架。
这将让您在一个单独的线程中生成一个 Actor,该线程有效地拥有与 DB 的连接。然后它可以侦听消息,根据这些消息执行 work/queries,并且 return 同步结果或期货。
它在更高级别处理消息传递、生成等的大部分样板文件。
actix 文档中还有一个 Diesel example,这听起来与您想到的用例非常接近。