Использование async в spawn_callback для записи вызывает RuntimeError: Cannot write () после finish () - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь использовать фоновый процесс, который запускается каждые 10 секунд, чтобы записать случайные вещи на веб-страницу. Загрузка страницы вызовет этот фоновый процесс один раз. Async def do_something () работает для печати (сообщение), но не работает на self.write (сообщение)

Я не уверен, стоит ли мне добавлять декоратор @ tornado.gen.coroutine в do_something, но я попробовал это и получил трекбек, в котором говорилось, что он никогда не ожидался.

"""
Python 3.5
This is the MainHandler being called from the def main()
"""
class MainHandler(tornado.web.RequestHandler):

    def get(self):
        global background_flag

        self.write("Hello, world")
        # Coroutines that loop forever are generally started with spawn_callback()
        if not background_flag:
            print ("Launching spawn_callback ...")
            tornado.ioloop.IOLoop.current().spawn_callback(self.minute_loop)
            background_flag = True

    async def minute_loop(self):
        while True:
            # await self.do_something() #do_something must be an async def as well non-blocking
            await self.do_something()
            await tornado.gen.sleep(10)

    async def do_something(self):
        now = DT.now()
        now_str = now.strftime("%d/%m/%Y %H:%M:%S")
        message = "[{0}] {1} : Running this".format(inspect.stack()[0].function, now_str)
        print (message)
        self.write(message)

Я ожидаю, что веб-страница будет обновлена ​​сообщением:
[do_something] 27/04/2019 23:42:08: Запуск этого
[do_something] 27/04/2019 23:42:18: Запуск этого

1 Ответ

0 голосов
/ 28 апреля 2019

Вам не нужно spawn_callback. Просто преобразуйте метод get в асинхронную сопрограмму и await на minute_loop.

async def get(self):
    ...
    await self.minute_loop()

Примечание: веб-страница не должна быть долго работающим соединением. Если вы хотите обновить веб-страницу новыми данными, вы должны рассмотреть веб-сокеты.

...