首页 文章

用coroutine获取龙卷风锁

提问于
浏览
0

以此代码为例 .

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 回答

  • 1

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

    第一个调用 acquire (FIFO)

    他们可能会在同时试图获得锁定的情况下陷入僵局

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

  • 1

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

相关问题