Tornado.ioloop.IOloop.start函数如何工作

时间:2015-01-25 07:28:26

标签: python tornado

在Tornado.ioloop.IOloop.start中只有一行代码:

raise NotImplementedError()

我想知道以下代码之后会发生什么

app.listen(8888)
tornado.ioloop.IOLoop.instance().start() 

感谢。

1 个答案:

答案 0 :(得分:2)

实际上并未使用class IOLoop(Configurable)。它只是一个基类。 Tornado会选择一个合适的子类作为默认IOLoop。这样做的类方法是:

@classmethod
def configurable_default(cls):
    if hasattr(select, "epoll"):
        from tornado.platform.epoll import EPollIOLoop
        return EPollIOLoop
    if hasattr(select, "kqueue"):
        # Python 2.6+ on BSD or Mac
        from tornado.platform.kqueue import KQueueIOLoop
        return KQueueIOLoop
    from tornado.platform.select import SelectIOLoop
    return SelectIOLoop

实现细节有点微不足道。首先在tornado.util中有一个class Configurable(object)。简单来说,它将使用configurable_default来配置自己。如上所述,我们的IOLoopConfigurable的子类,并使用自己的configurable_default来选择正确的IOLoop子类,该子类具有start函数的工作实现以及其他所有内容。

在Linux上,PollIOLoop.start方法实际上已执行。它的实现在这里:

https://github.com/tornadoweb/tornado/blob/master/tornado/ioloop.py#L705