使用pymongo驱动程序时,我是否应该担心线程安全?

时间:2014-02-02 01:34:09

标签: python multithreading mongodb concurrency

如果不存在具有特定身份的文档,我正在编写一个仅插入mongodb的函数。

e.g。

def insertOnlyIfNew(document, the_collection):
"""
:param the_collection: mongodb collection
"""
    pass

我打算通过查找文档的标识符来实现它(标识符不是ObjectId)。如果它不存在,那么我才会调用

the_collection.insert(document)

我使用的是CPython 2.7.5& pymongo。由于GIL生效,我可以放心地忽略竞争条件。对吗?

1 个答案:

答案 0 :(得分:1)

错误。 =)在应用程序执行find()的时间和尝试插入文档的时间之间,可能会发生以下几种情况:

  1. 如果您的应用程序是多线程的,则另一个线程可以修改MongoDB集合。 (Python在等待网络响应时释放GIL。)

  2. 可能在另一台机器上的另一个进程可以连接到MongoDB并更改集合。

  3. 但在这种情况下,您的要求很容易满足。关于必须是唯一的字段的Create a unique index。每当您的应用程序尝试插入文档时,如果已存在具有相同标识符的文档,PyMongo将引发DuplicateKeyError:

    try:
        the_collection.insert(document)
    except pymongo.errors.DuplicateKeyError:
        print 'caught DuplicateKeyError'