Как записать сообщение в веб-сокет, пока firestore on_snapshot не является ожидаемым? - PullRequest
0 голосов
/ 26 июня 2019

Я должен подписаться на обновление в реальном времени из Firestore, а затем отправить их через веб-сокет в Торнадо

Я пытался использовать IOLoop.run_in_executor, IOLoop.run_on_executor, @ gen.coroutine, async, ожидают, но они не работают,Единственный успешный способ - назначить изменение какой-либо переменной, а затем использовать PeriodicCallback для отправки их через websocket, но это не в режиме реального времени.

class SocketHandler(WebSocketHandler):
    def open(self, sport, event):
        f = firestore.Client()
        query_ref = f.collection('some_col').document('some_doc')
        # Can not await here
        query_watch = query_ref.on_snapshot(self.callback)

    def callback(self, doc_snapshot, changes, read_time):
        for change in changes:
            if change.type.name == 'ADDED':
                # Not possible to write_message because the event loop is done
                self.write_message('ADDED')

Я должен нажать на изменение, как только получуобновление из Firestore до веб-сокета.

Edit

on_snapshot само по себе является открытым потоком, но цикл событий продолжается.

после изменения, поступающего из Firestore, слишком поздно, цикл событий завершен.

Как мне написать write_message, пока не запущен цикл событий?

...