在多个Python Worker之间共享Postgres表中指定的工作

我在Postgres中使用SQL Alchemy。我有一个称为Jobs的表,其定义如下:

class Job(Base):
    id = Column(Integer,primary_key=True)
    processed = Column(Boolean,default=False)
    data = Column(String)

让我们假设处理数据需要花费一分钟。我想产生多名工人,这些工人将工作从餐桌上拿下来并进行处理。当工人查询工作时,它将寻找当前未处理的第一个未处理的工作(顺序无关紧要)。

我当时在考虑将selectwith_for_update一起使用来锁定将要处理的行,这样就不会产生与处理同一件事的工人冲突:

job_to_process = session.query(Job).filter_by(processed=False).with_for_update().first_or_none()

问题是,如果工作程序A启动,它将获得作业1,然后在工作程序A处理工作1的同时启动工作程序B,但是上述查询将尝试将工作1返回给工作程序B并失败,直到锁被解除。有什么方法可以使工作程序B运行上面的查询以返回未锁定的第一行并忽略锁定的行?

soei4366 回答:在多个Python Worker之间共享Postgres表中指定的工作

Postgres具有SKIP LOCKED选项,并且它们在the docs中指定的用例似乎与您的目标密切相关:

  

...跳过任何无法立即锁定的选定行。   跳过锁定的行会提供不一致的数据视图,因此   这不适合一般用途,但可以用来   避免与多个使用者访问类似队列的锁争用   桌子。

在等式的SQLAlchemy端,您已经在使用的with_for_update()方法提供了skip_locked布尔标志:

  

...将在Oracle和PostgreSQL方言上呈现FOR UPDATE SKIP LOCKED或FOR SHARE   如果还指定了read = True,则跳过锁定。

因此,似乎您已经涵盖了Postgresql和SQLAlchemy:)

本文链接:https://www.f2er.com/3160209.html

大家都在问