通过协同程序收购Tornado Locks



以这段代码为例。

from tornado import gen, locks
lock = locks.Lock()
@gen.coroutine
def f():
    while True:
        with (yield lock.acquire()):
            # Do something holding the lock.
            pass
        # Now the lock is released.
        yield gen.sleep(0.5)

假设我有一个协程,它在无限循环中每秒运行一次,其中有一些全局变量,在例程完成之前无法更改。

当这个例程忙于处理时,我有几个http请求。所有这些请求都在等待获取锁。哪个请求将首先获取锁,在两个请求都试图同时获取锁的情况下,它们是否可能死锁?

锁定队列系统不是一个更好的选择吗?如果添加了一个等待请求列表,那么你就有了一个FIFO队列,还是没有必要这样做?

哪个请求将首先获取锁?

第一个称为acquire(FIFO)

有没有可能在双方都试图同时获取锁定的情况下发生死锁

下一个将等待,直到上一个解锁。如果您同时为而烦恼tornado.locks意味着仅适用于单线程应用程序,因此这是不可能的。但是,它不是死锁,在acquire中设置timeout非常有帮助。想象一下,例程锁定然后为高负载服务器获取数据(或等待另一个锁定),其余的等待程序可能会等待太长,甚至无限。

如果两个请求同时尝试获取锁,其中一个将获胜。只有一个锁就不可能出现死锁。Tornado的Lock在内部使用一个队列,因此等待的请求将按照它们称为acquire()的顺序获取锁。

最新更新