Я прихожу из земли Twisted
/Klein
. Я пришел с миром и попросил помощь Tornado
. Я изучаю Tornado и как его асинхронный подход отличается от Twisted. Витая есть что-то похожее на gen.coroutine
, который defer.inlineCallbacks
и я могу написать код асинхронной так:Итерация петли с ожиданием или выходом вызывает ошибку
kleinsample.py
@app.route('/endpoint/<int:n>')
@defer.inlineCallbacks
def myRoute(request, n):
jsonlist = []
for i in range(n):
yield jsonlist.append({'id': i})
return json.dumps(jsonlist)
локон CMD:
curl localhost:9000/json/2000
Эта конечная точка будет создайте строку JSON с числом элементов n
. n
может быть маленьким или очень большим. Я могу разбить его в Twisted, чтобы цикл событий не блокировал использование yield
. Теперь вот, как я попытался преобразовать это в Торнадо:
tornadosample.py
async def get(self, n):
jsonlist = []
for i in range(n):
await gen.Task(jsonlist.append, {'id': i}) # exception here
self.write(json.dumps(jsonlist))
отслеживающий:
TypeError: append() takes no keyword arguments
Я смущен о том, что я должен сделать, чтобы правильно перебирать каждый элемент в цикле, чтобы цикл события не блокировался. Кто-нибудь знает способ «Торнадо» сделать это?
Я планировал сделать что-то похожее на ваш ответ (что-то вроде '' wait Future() ', а затем добавить). Надеемся найти лучшее решение, если не ваш ответ. Это не интенсивность процессора, но фактический код (который значительно сложнее, чем пример в моем сообщении) - это раздел, который блокирует достаточно, чтобы нарушить другие функции на моем текущем синхронном сайте. Поэтому мое желание * приостанавливать * итерирование на * момент * (все каламбуры предназначены). –
Что будет «лучшим решением», чем то, что я разместил? С чем я могу вам помочь? –
Извините, это не значит, что ваш ответ не был хорошим ответом. Я мог бы поклясться, что в последний раз, когда я использовал Tornado, была функция, которая позволяла мне передавать итерируемый или генератор, а затем асинхронно запускать обратные вызовы на элемент. У Twisted есть что-то, называемое Cooperator, которое может сделать что-то подобное, поэтому я подумал, что у Tornado есть аналогичное решение. Ваше решение должно быть в порядке для моих требований. –