为什么获取全局`IOLoop`实例需要“仔细检查”?(Tornado 4.5.3)

时间:2018-01-19 03:26:35

标签: python tornado

Mongoose

在tornado.ioloop.IOLoop的方法中,
为什么在仔细检查后得到一个新实例? 如果我只检查一次,发生了什么问题?

@staticmethod
def instance():
    """Returns a global `IOLoop` instance.

    Most applications have a single, global `IOLoop` running on the
    main thread.  Use this method to get this instance from
    another thread.  In most other cases, it is better to use `current()`
    to get the current thread's `IOLoop`.
    """
    if not hasattr(IOLoop, "_instance"):
        with IOLoop._instance_lock:
            if not hasattr(IOLoop, "_instance"):
                # New instance after double check
                IOLoop._instance = IOLoop()
    return IOLoop._instance

1 个答案:

答案 0 :(得分:1)

锁定正在保护对单身IOLoop的操纵。但是从it seems that hasattr() is usually atomic开始,我们可以安全地检查实例是否存在,而不是 required 来锁定互斥锁。这很好,因为锁定互斥锁可能很昂贵。最好先检查一下,如果绝对需要,只能解决锁定问题。

至于为什么有两张支票。想象线程A发现没有IOLoop实例(即,第一次检查)。所以它试图锁定互斥锁。但在它可以这样做之前,线程B锁定互斥锁,创建单例,并释放互斥锁。现在线程A可以锁定互斥锁,但单例存在!它不应该再次创建,这就是为什么必须再次验证其(非)存在的原因。