Я хотел бы запускать определенные длительные функции (которые выполняют запросы к базе данных) в отдельном потоке. Однако давайте предположим, что базовый механизм базы данных допускает только одно соединение за раз, а структура соединения не Sync
(я думаю, что по крайней мере последнее верно для diesel
).
Мое решение состояло бы в том, чтобы иметь один отдельный поток (в отличие от пула потоков), в котором выполняется вся работа с базой данных и который выполняется, пока основной поток жив.
Я думаю, что знаю, как мне пришлось бы делать это с передачей сообщений по каналам, но для этого требуется довольно много стандартного кода (например, явная отправка аргументов функции по каналу и т. Д.).
Есть ли более прямой способ достижения чего-то подобного с помощью ржавчины (и, возможно, Tokio и новой нотации async / await, которая появляется ночью)?
Я надеюсь сделать что-то вроде:
let handle = spawn_thread_with_runtime(...);
let future = run_on_thread!(handle, query_function, argument1, argument2);
где query_function
будет функцией, которая немедленно возвращает будущее и выполняет работу в другом потоке.
Ночная ржавчина и внешние ящики / макросы будут в порядке.