0
0 комментариев

Есть tcp-клиент на tornado. Вот код его запуска:

@gen.coroutine
def main():
    factory = TCPClient()
    # Подсоединяемся по сокету
    stream = yield factory.connect(af=socket.AF_INET, **options.options.group_dict("connect"))
    # Добавляем callback
    ioloop.IOLoop.instance().add_callback(notification, stream)
    # Запускаем приложение
    app = Application(stream)
    app.run()
 
if __name__ == '__main__':
    try:
        main()
        ioloop.IOLoop.instance().start()
    except KeyboardInterrupt:
        pass

Приложение запускается, все хорошо, но есть проблема, по неизвестной мне причине не запускается callbacknotification.

Привожу функцию работы самого приложения:

@gen.coroutine
def run(self):
    while True:
        try:
            s = input('> ')
            command, text = self._parse_command(s)
            handler = self.handler(self._stream, self)
            yield handler.execute_command(command, text)
        except Exception as e:
            print(e)

Это функция работы приложения, она там что-то пишут в сокет после ввода данных и ожидает пользовательского ввода.

И привожу код функции notification, она что-то читает из сокета и выводит на экран:

@gen.coroutine
def notification(stream):
    message_length = yield stream.read_bytes(2)
    length = struct.unpack("!H", message_length)[0]
    message = yield stream.read_bytes(length)
    # request = Message.unpack(message=message)
    sys.stdout.write('\r'+' '*(len(readline.get_line_buffer())+2)+'\r')
    print(message)
    sys.stdout.write('> ' + readline.get_line_buffer())
    sys.stdout.flush()
    ioloop.IOLoop.instance().add_callback(notification, stream)

Вопрос собственно говоря в том, как мне запустить в background функцию notification, что бы она что-то читала из сокета ну и выводила информацию в консоль?


Добавить комментарий