使用协程获取龙卷风锁

时间:2015-12-29 07:43:51

标签: python tornado

以此代码为例。

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队列,或者这不是必需的吗?

2 个答案:

答案 0 :(得分:1)

如果两个请求同时尝试获取锁定,其中一个将获胜。单锁没有死锁的可能性。 Tornado' s Lock在内部使用队列,因此等待请求将按照他们调用acquire()的顺序获取锁定。

答案 1 :(得分:1)

  

哪个请求会首先获得锁定?

第一个调用<div>(FIFO)

  

他们可能会在两个人同时试图获得锁定时陷入僵局

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