Асинхронные запросы к Twisted-приложению?

Привет, Хабр.


Есть приложение на twisted, которое обращается к некоему удаленному сервису через внешнюю питоновую библиотеку:

import externalLib
def render_POST(self, request):
    #some code here
    result = self.doQuery(...)
    return json.dumps(result)

def doQuery(self, ...):
    #some code
    return externalLib.request()



Проблема в том, что если в функции doQuery (или даже на externalLib.request) что-то затормозит — например, удаленный сервис будет долго отвечать — то все остальные http-запросы к twisted-приложению также будут ждать результата обработки предыдущего запроса. (Если что, externalLib делает http-запрос через requests.)

Знатоки, подскажите, пожалуйста — как сделать приложение асинхронным и не заставлять новые запросы ждать завершения предыдущих?

Спасибо.
  • Вопрос задан
  • 3702 просмотра
Решения вопроса 1
@Tricesimus
from twisted.internet import reactor, threads

def doLongCalculation():
    # .... do long calculation here ...
    return 3

def printResult(x):
    print x

# run method in thread and get result as defer.Deferred
d = threads.deferToThread(doLongCalculation)
d.addCallback(printResult)
reactor.run()


Но, по последним наблюдениям, callback вызовется не раньше, чем через секунду.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы