我正在使用Python的multiprocessing库来生成多个进程,每个进程都会写入一个共享的(MongoDB)数据库。这样做是否安全?还是说这些写操作会相互覆盖?
我正在使用Python的multiprocessing库来生成多个进程,每个进程都会写入一个共享的(MongoDB)数据库。这样做是否安全?还是说这些写操作会相互覆盖?
如果您的进程只是将文档插入数据库,每个插入通常会创建一个单独的对象。
例外情况是,如果您明确为文档指定了_id
,并且该标识符已在集合中使用过,则插入将失败。(因此不要这样做:省略_id
,MongoDB将始终为您生成唯一值。)
如果您的进程正在从数据库中删除文档,则如果另一个进程已经删除了相同的对象,则操作将失败。(尽管如此,这并不严格意义上的失败;这只是意味着有人比你先到了那里。)
如果您的进程正在更新数据库中的文档,则情况变得更加复杂。
只要每个进程都在更新不同的文档,那么就没问题。
如果多个进程同时尝试更新同一文档,则需要小心处理。替换对象上的值的更新将按顺序应用,这可能会导致一个进程所做的更改被另一个进程意外地覆盖。您应该小心避免指定您不打算更改的字段。使用MongoDB的update operators可以有助于以原子方式执行复杂操作,例如更改字段的数字值。
Process A Process B
--------- ---------
Reads object from DB ...
working... Reads object from DB
working... working...
updates object with changes working...
updates object with changes