如何防止两个用户在 Pyramid 视图中执行一个函数

How to prevent two users execute a function inside a Pyramid view

我有一个金字塔视图连接到像 /my/view

这样的路线

因为Pyramid的架构,两个请求可以同时访问同一个视图。在我看来,我有一个功能,一次只能有一个用户访问,这意味着:如果用户 A 正在处理该功能,而用户 B 调用该视图,则用户 B 在 A 完成之前不会进入该功能。

我试过:

lock.acquire()
try:
    my_function()
finally:
    lock.release()

但是由于 Pyramid 在每次请求时都启动一个新线程,因此它不起作用。

知道如何控制它吗?

假设锁定义在视图调用之间共享的位置(模块变量、注册表变量等),您的锁应该可以工作。值得注意的是 Pyramid 本身不会启动新线程。这是由您的 WSGI 服务器完成的,每个服务器的详细信息对于回答您的问题很重要。

如果您使用女服务员,则请求由线程处理,因此在共享内存中 space 您可以在请求之间共享锁。在其他情况下,每个请求都使用一个单独的进程,此时线程级锁将不起作用。因此,这取决于您的部署,哪里才是定义锁的最佳位置。例如,要跨进程共享锁,redis 或您的数据库是个好地方。