Запустить функцию async в определенном потоке

Я хотел бы запустить определенные длительные функции (которые выполняют запросы к базе данных) в отдельном потоке. Однако предположим, что базовый движок базы данных допускает только одно соединение, а структура соединения не является Sync (по-моему, по крайней мере последнее относится к diesel ).

Мое решение состояло бы в том, чтобы иметь отдельный отдельный поток (в отличие от пула потоков), где происходит вся работа с базой данных и которая работает до тех пор, пока основной поток жив. Я думаю, что знаю, как мне придется делать это с передачей сообщений по каналам, но для этого требуется довольно некоторый шаблонный код (например, явная отправка аргументов функции по каналу и т. Д.).

Есть ли более прямой способ добиться чего-то подобного с ржавчиной (и, возможно, tokio и новой асинхронной / ожидающей нотации, которая ночной)?

Я надеюсь что-то сделать так:

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

где query_function будет функцией, которая немедленно возвращает будущее и выполняет работу над другим потоком.

Руста ночные и внешние ящики / макросы были бы в порядке.

Всего 1 ответ


Если внешние ящики являются опцией, я бы подумал о том, чтобы взглянуть на actix , актерскую структуру для ржавчины.

Это позволит вам создавать персонажа в отдельном потоке, который фактически владеет соединением с БД. Затем он может слушать сообщения, выполнять работу / запросы на основе этих сообщений и возвращать результаты синхронизации или фьючерсы.

Он заботится о большей части шаблона для передачи сообщений, нереста и т. Д. На более высоком уровне.

В документации actix есть также пример Diesel, который звучит довольно близко к используемому случаю, который вы имели в виду.


Есть идеи?

10000