2016-12-01 4 views
0

Как свести к минимуму блокировку резьбы с помощью Tornado? На самом деле, у меня уже есть рабочий код, но я подозреваю, что он не является полностью асинхронным.Оптимизируйте код асинхронного торнадо. Минимизация блокировки резьбы

У меня очень длинная задача. Он состоит из нескольких запросов к CouchDB для получения метаданных и построения окончательной ссылки. Затем мне нужно сделать последний запрос CouchDB и передать файл (от 10 МБ до 100 МБ). Таким образом, результатом будет потоковая передача большого файла клиенту.

Проблема в том, что сервер может принимать 100 одновременных запросов на загрузку больших файлов, и мне не нужно блокировать поток и продолжать получать новые запросы (мне нужно минимизировать блокировку потока).

Итак, я делаю несколько синхронных запросов (requests), а затем поток большого файла с кусками с AsyncHttpClient.

на вопросы заключаются в следующем:

1) Должен ли я использовать AsyncHTTPClient ВЕЗДЕ? Поскольку у меня есть интерфейс, потребуется довольно много времени, чтобы заменить все синхронные запросы асинхронными. Стоит ли это делать?

2) Должен ли я использовать tornado.curl_httpclient.CurlAsyncHTTPClient? Будет ли код работать быстрее (загрузка файла, выполнение запросов)?

3) Я вижу, что Python 3.5 представил async, и теоретически это может быть быстрее. Должен ли я использовать async или продолжать использовать декоратор @gen.coroutine?

ответ

2

Используйте AsyncHTTPClient или CurlAsyncHTTPClient. Поскольку библиотека «запросы» является синхронной, она блокирует цикл событий Tornado во время выполнения, и вы можете иметь только один запрос в процессе одновременно. Для выполнения асинхронных сетевых операций с Tornado требуется специальный асинхронный сетевой код, например CurlAsyncHTTPClient.

Да, CurlAsyncHTTPClient немного быстрее, чем AsyncHTTPClient, вы можете заметить ускорение, если вы будете передавать с ним большие объемы данных.

async и await быстрее, чем gen.coroutine и yield, поэтому если у вас есть yield заявления, которые выполняются очень часто в тугой петлей, или если у вас есть глубоко вложенные сопрограмм, которые называют сопрограмм, это будет иметь смысл в порт вашего кода.