以此代码为例。
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队列,或者这不是必需的吗?
答案 0 :(得分:1)
如果两个请求同时尝试获取锁定,其中一个将获胜。单锁没有死锁的可能性。 Tornado' s Lock
在内部使用队列,因此等待请求将按照他们调用acquire()
的顺序获取锁定。
答案 1 :(得分:1)
哪个请求会首先获得锁定?
第一个调用<div>
(FIFO)
他们可能会在两个人同时试图获得锁定时陷入僵局
下一个会等到上一次解锁。如果您对同时感到烦恼,acquire
仅适用于单线程应用,那么这是不可能的。但是,它并非死锁,在tornado.locks
中设置timeout
非常有帮助。想象一下例程锁定然后获取高负载服务器的数据(或等待另一个锁定),其余的服务员可能会等待太长甚至无限期。