【问题标题】:How to prevent two users execute a function inside a Pyramid view如何防止两个用户在金字塔视图中执行一个函数
【发布时间】:2020-11-01 23:55:34
【问题描述】:

我有一个金字塔视图连接到 /my/view 之类的路线

由于 Pyramid 的架构,两个请求可以同时访问同一个视图。在我的视图中,我有一个函数,一次只有一个用户可以访问,这意味着:如果用户 A 正在处理该函数并且用户 B 调用视图,那么用户 B 直到 A 完成才进入该函数。

我试过了:

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

但是由于 Pyramid 每次请求都会启动一个新线程,所以它不起作用。

知道如何控制它吗?

【问题讨论】:

    标签: pyramid


    【解决方案1】:

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

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

    【讨论】:

    • 我在 gevent 中使用 gunicorn。对于 reddis,您的意思是拥有一个布尔字段来控制访问?
    • 我认为它比布尔字段更复杂,因为您需要一个原子的比较和设置操作。 redis.io/topics/distlock有一些关于使用redis做加锁的资料。
    • 当 gunicorn 与 gevent 一起使用时,您的所有代码都在单个进程中的单个线程中运行,如果该进程被正确地打了猴子补丁,那么您的示例代码可能会在某个地方定义锁的情况下工作跨请求共享。请注意,gevent 也有自己的原语,可用于锁定 gevent.org/api/gevent.lock.html
    猜你喜欢
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    相关资源
    最近更新 更多