以这段代码为例。
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()
的顺序获取锁。