2014-09-03 37 views
2

MongoReplicaSetClient docs明確指出,你不能在的過程中使用MongoReplicaSetClient這兩個過程。pymongo.MongoClient os.fork後

問題:是否保證MongoClient在進程fork之後工作?或者獨立地在每個進程中啓動到數據庫的單獨連接更好?

據我所知,文件描述符cannot be safely used在進程fork之後更進一步,因爲兩個進程共享相同的文件描述結構。但是,這些不是文件,而是網絡連接,被包裝到一些python類中;所以我基本上不知道類似的邏輯是否適用於這裏,MongoClient,或者由於某種原因保證實際工作正常。

我也不明白,如果有任何子進程先於別人退出,那麼網絡連接是否會被關閉(簡單的寫法表明它沒有,但爲什麼並且總是這樣?)。

回答

1

MongoClient 3.2可以在fork()之後工作,但只能在某些平臺上工作。下面是從文檔片段:http://api.mongodb.org/python/current/faq.html#using-pymongo-with-multiprocessing

有幾件事情要注意使用與 PyMongo多處理時的感覺。在某些平臺上(此處定義),MongoClient必須爲 ,如果在分支之前初始化子進程中使用的MongoClient進程,則使用connect = False進行初始化。如果連接不能爲False,則 ,那麼MongoClient必須在分叉後初始化。

這是因爲在調用 getaddrinfo()之前,CPython必須獲取一個鎖。如果MongoClient的父代 在監視器線程處於 getaddrinfo()系統調用中時(在主線程上)分叉,則會發生死鎖。

如果發生這種死鎖 的機會,PyMongo將發出警告。