Tornado @gen.coroutine затваря дълга връзка за анкетиране

Здравейте, имам проблем с рамката на Tornado, която прилага дълго анкетиране. Методът за публикуване на моя requesthandler е украсен както с @asynchronous, така и с @gen.coroutine. Когато го оставя да виси, за да бъде извикано обратно извикване, за да пиша обратно на клиента, връзката незабавно се затваря. Видях, че това е свързано с използването на @gen.coroutine, което автоматично извиква self.finish(), когато всички фючърси са дадени. Имам нужда от този декоратор, защото използвам Mongo Motor. Кратък пример по-долу:

@web.asynchronous
@gen.coroutine
def post(self):
  #mongo Motor yielding code  
  notifications.register_callback(self.on_message)

Известията са глобален обект, който съхранява масив от обратни извиквания и ги извиква при получаване на съобщение отвън. Благодаря


person Peterdeka    schedule 17.10.2014    source източник


Отговори (1)


Трябва да използвате @gen.engine вместо @gen.coroutine, ако искате да използвате yield за извикване на съпрограми, но да не се извиква автоматично self.finish() в края на манипулатора. Има коментар в кода на декоратора @web.asynchronous, който отбелязва това:

# If @asynchronous is used with @gen.coroutine, (but
# not @gen.engine), we can automatically finish the
# request when the future resolves.  Additionally,
# the Future will swallow any exceptions so we need
# to throw them back out to the stack context to finish
# the request.

Така че, ако @asynchronous се използва с @gen.coroutine, той автоматично ще извика self.finish, но ще го пропусне, ако се използва с @gen.engine.

person dano    schedule 17.10.2014
comment
@Peterdeka Да, трябва да можете да използвате същия синтаксис за извикване на motor. - person dano; 17.10.2014