0

我有一堆需要从数据库中获取单个记录(行)的芹菜工人。

只有在“last_used”字段后 60 秒后才应该返回它,并且一旦返回,它应该用当前时间更新“last_used”(因此其他具有 0 延迟无限重试的工作人员不会得到相同的)

是否可以在数据库级别完成所有这些操作?我不会有任何其他来源更新这个“last_used”字段。

这是单行的样子。

{"id": "..." "last_used": "2016-06-31 00:37:21.241833", "item": "string"}

我试过了:

conn = r.connect(host='localhost', port=28015)
do = r.db('database').table('tb').order_by(index=("last_used")).limit(1).update(
{'last_used': r.now()}
, return_changes=True).run(conn)

而且它不起作用,多个工作人员在更改之前返回同一行。

4

1 回答 1

0

我想我做到了,尝试运行 50 名工人反对它,但冲突为 0。但我仍然是 rethinkdb 的新手,很想听听您对此的想法,从这里借来的。

@app.task(bind=True, default_retry_delay=0, max_retries=999)
def ss(self):        
    conn = r.connect(host='localhost', port=28015)
    do = r.db('').table('').order_by("last_used").filter(
    r.now() - r.row['last_used'] > 10
    ).filter({'status': 1}).limit(1).update(
    r.branch(r.row["status"] == 1, {'status': 2, "last_used": r.now()}, {}),
    return_changes=True).run(conn)


    try:
        got_item = do['changes'][0]['new_val']['id']
        last_used = do['changes'][0]['new_val']['last_used']
    except:
        # print('error', do)
        raise self.retry()

    if got_item:
        # Do stuff that required unique row here....
        print(got_item,'\n',last_used)
        time.sleep(random.randrange(1,5))
        r.db('').table('').get(got_item).update({"status": 1}).run(conn)

#start workers
for i in range(50):
    ss.delay()

我希望有了这个,工人可以保证在“if got_item”块中使用独特的项目。

于 2016-07-27T04:48:44.430 回答