Tornado框架中的IOLoop.instance.start()阻止了执行

时间:2016-02-19 17:08:44

标签: python asynchronous tornado

我试图使用Tornado创建一个非阻塞的TCP服务器。

所以我已按照API中所述的TCPServer进行了子类化并实施了handle_stream

但是当执行范围IOLoop.current().start()没有继续进行时。 在所有示例中,我都看到TCPServer的工作原理。

我认为我完全不了解这项技术。我错过了什么?为什么永远不会达到IOLoop.instance().stop()

import logging
import tornado

from tornado import gen
from tornado.tcpserver import TCPServer
from tornado.ioloop import IOLoop
from tornado.netutil import bind_sockets

class CashDeskTCPServer(TCPServer):

    @gen.coroutine
    def handle_stream(self, stream, address):
        self._stream = stream
        self._read_line()

    @gen.coroutine
    def _read_line(self):
        self._stream.read_until('\n', self._handle_read)

    @gen.coroutine
    def _handle_read(self, data):
        self._stream.write(data)
        self._read_line()


if __name__ == '__main__': 

    sockets = bind_sockets(8889)
    tornado.process.fork_processes(0)
    server = CashDeskTCPServer()
    server.add_sockets(sockets)
    IOLoop.instance().start()

    IOLoop.instance().stop()

1 个答案:

答案 0 :(得分:0)

龙卷风' doc

  

循环将一直运行,直到其中一个回调调用stop(),这将是   在当前事件迭代完成后使循环停止。

换句话说 - IOLoop的开始是阻止,而它运行。如果循环停止,将执行下一个语句。此外,停止ioloop意味着停止收听(接受新的连接)。

但是既然你使用fork_processes(0),你可能想在除了一个之外的所有进程上运行ioloop(父级 - 让我们说主人)

if __name__ == '__main__': 

    sockets = bind_sockets(8889)
    tornado.process.fork_processes(0)
    server = CashDeskTCPServer()
    server.add_sockets(sockets)
    # if you have 1 core there is no forks, so no ioloop will start
    if tornado.process.task_id() != 0:
        IOLoop.instance().start()
    else:
        print('Master process didn't start IOLoop')