Использование торнадо, создание асинхронной функции для функции блокировки, которая использует sqlalchemy fetchmany () - PullRequest
0 голосов
/ 10 октября 2018

В настоящее время я использую торнадо для разработки API, который будет иметь несколько пользователей.По соображениям производительности было бы полезно, чтобы весь API был асинхронным.В текущем коде я использую cursor.fetchmany (количество строк) для извлечения многих строк из базы данных и записи в указанный файл (csv, json).Я пытаюсь сделать этот процесс асинхронным, но у меня возникают проблемы с этим.Выборка имеет дело с большим объемом данных, поэтому, если несколько человек используют API, это значительно замедлит его, поскольку люди «ждут» завершения выборки других пользователей.

Я пытался использовать IOLoop с небольшим успехом

Также я пытался что-то вроде этого

async def loop(self):
        I = await val.cursor.fetchmany(100)

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

1) Кто-нибудь смог реализовать решение, позволяющее сделать этот процесс асинхронной выборки

2) Возможно ли это или база данных ограничивает функциональность?асинхронного кодирования торнадо

3) Если это невозможно, могу ли я реализовать что-то вроде «ThreadPoolExecutor» для ускорения процесса путем многопоточности или использования замены fetchmany?(Я не думаю, что это возможно, но просто пытаюсь обрисовать некоторые мои мыслительные процессы)

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 10 октября 2018

Обычно я обертываю функцию SQLAlchemy в другом методе с помощью @ gen.coroutine decorator, поэтому это может быть асинхронный метод.

Например:

@gen.coroutine
def fetchmany():
   return val.cursor.fetchmany(100)

@gen.coroutine
def loop(self):
   I = yield fetchmany()

Я надеюсь помочь вам

...