【发布时间】:2020-11-18 18:12:59
【问题描述】:
我有一个使用 fastapi 的异步 http web 服务。我在不同端口上的服务器上运行同一服务的多个实例,并且前面有一个 nginx 服务器,因此我可以全部使用它们。我有一个特定的资源,我需要保护它只有一个客户在访问它。
@app.get("/do_something")
async def do_something():
critical_section_here()
我尝试使用这样的文件锁来保护这个关键部分:
@app.get("/do_something")
async def do_something():
with FileLock("dosomething.lock"):
critical_section()
这将防止多个进程同时进入临界区。但我发现这实际上会死锁。考虑以下事件:
- 客户端1连接到8000端口并进入临界区
- 当客户端 1 仍在使用资源时,客户端 2 被路由到同一个端口 8000,然后它会尝试获取文件锁,它不能,所以它会继续尝试,这将阻止客户端 1 和客户端的执行1 将永远无法释放文件锁,这意味着不仅此进程被锁定,所有其他服务器实例也将被锁定。
有没有办法让我协调这些进程,使它们中只有一个访问关键部分?我想过给文件锁加一个超时,但我真的不想拒绝用户,我只想等到轮到他/她进入临界区。
【问题讨论】:
标签: python multiprocessing synchronization python-asyncio file-locking