3

我有两个客户端(python)操作同一个集合,集合用作池,集合中的每条记录只能在一个客户端中使用。我使用下面的代码来确保它(它不是关键系统,所以可以容忍一点点错误)。

for i in range(100):
    record = collection.find_one({"used1":{"$exists":False}})
    record["used1"] = True
    collection.save(record)
    ...do sth I want...

但我发现有时两个客户端不同步,本地客户端获取记录,10秒后远程客户端也将相同的记录。

其实如果2个客户端在不到2秒的时间内拿到记录,那是可以容忍的,但是10秒就太长了。

我认为这里存在缓冲区/同步问题,我能做些什么来减少这些问题?

4

1 回答 1

3

您的代码不是线程安全的——这意味着它不能保证两个客户端不能都将记录 [“used”] 字段更新为“True”并且都认为他们是第一个/唯一这样做的。

您需要使用的是findAndModify命令,如果该字段不存在,它将用“True”自动更新记录,然后将相同的记录返回给刚刚更新的客户端。

这保证了每个文档只能由一个线程处理,但是,您仍然必须处理您的代码现在遇到的相同问题 - 如果客户端进程在将此“used1”字段设置为 true 之后但在其工作之前死亡,您的数据将处于不一致的状态。

于 2012-07-14T04:24:09.217 回答