特定の実行時間の長い関数 (データベース クエリを実行する関数) を別のスレッドで実行したいと考えています。ただし、基盤となるデータベース エンジンでは一度に 1 つの接続しか許可されておらず、接続構造体では許可されていないと仮定しましょうSync
(少なくとも後者は に当てはまると思いますdiesel
)。
私の解決策は、すべてのデータベース作業が発生し、メインスレッドが生きている限り実行される単一の個別のスレッド (スレッドプールとは対照的に) を持つことです。チャネルを介してメッセージを渡す方法でこれを行う必要があることはわかっていると思いますが、それにはかなりのボイラープレート コードが必要です (たとえば、関数の引数をチャネルを介して明示的に送信するなど)。
このようなことを錆で達成するためのより直接的な方法はありますか?
私は次の行に沿って何かをしたいと思っています:
let handle = spawn_thread_with_runtime(...);
let future = run_on_thread!(handle, query_function, argument1, argument2);
wherequery_function
は、すぐにフューチャーを返し、他のスレッドで作業を行う関数になります。
Rust nightly と外部クレート/マクロは問題ありません。