龙卷风没有运行回调

时间:2015-12-07 23:20:00

标签: python tornado python-3.4

这是非常简单的tcp-chat客户端。这是主要功能:

@gen.coroutine
def main():
    factory = TCPClient()
    stream = yield factory.connect(af=socket.AF_INET, **options.options.group_dict("connect"))
    # Add notification callback
    ioloop.IOLoop.instance().add_callback(notification, stream)
    # Run application
    app = Application(stream)
    app.run()

if __name__ == '__main__':
    try:
        main()
        ioloop.IOLoop.instance().start()
    except KeyboardInterrupt:
        pass

应用程序正在运行。应用程序从控制台读取数据,将其发送到套接字。主要应用循环:

@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)

我有控制台通知。此函数从套接字读取响应并打印到控制台:

@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)

我将此函数作为回调添加到ioloop中。但是这个功能永远不会运行。如何在后台运行通知?请帮助我...

UPD: 我在新线程中创建新线程并运行通知:

th = threading.Thread(target=notification, args=(self._stream, ))
th.run()

但它没有帮助......

1 个答案:

答案 0 :(得分:1)

input()是阻止函数;等待输入时别的什么都不会发生。为了使应用程序能够响应,您必须重新编写它以避免阻塞input()之类的函数,或者在单独的线程上执行这些函数。