Я работаю над приложением, которое использует LevelDB
и которое использует несколько долгоживущих процессов для различных задач.
Поскольку LevelDB позволяет только одному процессу поддерживать соединение с базой данных, доступ ко всем нашим базам данныхнаправляется через специальный процесс базы данных .
Для доступа к базе данных из другого процесса мы используем BaseProxy
.Но поскольку мы используем asyncio
, наш прокси не должен блокировать эти API, которые вызывают процесс db, который затем в конечном итоге читает из db.Поэтому мы реализуем API на прокси с помощью исполнителя.
loop = asyncio.get_event_loop()
return await loop.run_in_executor(
thread_pool_executor,
self._callmethod,
method_name,
args,
)
И хотя это работает просто отлично, мне интересно, есть ли лучшая альтернатива обертыванию вызова _callmethod
BaseProxy
в ThreadPoolExecutor
.
Насколько я понимаю, вызов BaseProxy
в процесс DB является учебным примером ожидания ввода-вывода, поэтому использование потока для этого кажется ненужным расточительным.
Видеальный мир, я бы предположил, что async _acallmethod
существует на BaseProxy
, но, к сожалению, API не существует.
Итак, мой вопрос сводится к следующему: при работе с BaseProxy
более эффективная альтернатива выполнению этих межпроцессных вызовов в ThreadPoolExecutor
?