2014-08-28 23 views
3

我有一個扭曲的服務器應用程序與大約1000個客戶端保持持久連接。每個客戶端偶爾會將數據發送到我的扭曲服務器,並且我希望該服務器將數據存儲到MongoDB數據庫中。到現在爲止還挺好。在扭曲中使用pymongo究竟有什麼錯誤?

但是,pymongo文檔陳述了類似「沒有好方法使用pymongo扭曲」。我不明白爲什麼不。有人能解釋究竟是什麼問題以及陷阱是什麼?我認爲這與pymongo是同步的有關,但我想要做的就是將一些東西插入數據庫。

如果我在一個文件connector.py中聲明瞭一個pymongo.MongoClient實例,然後將連接器導入運行我的Twisted工廠和協議的主python文件,我應該可以使用pymongo的實例每個協議中的MongoClient(連接到每個客戶端)將數據存儲到數據庫。

那究竟是什麼問題呢?顯然我有點困惑。

回答

5

總之:pymongo呼叫攔截,當他們跑凍結扭曲發動機直到調用返回,這是隨機破壞性的扭曲的內部狀態,因爲它是一個什麼樣Twisted是專爲相反。

相反,你應該尋找一個扭曲的可比較的驅動程序,如tx-mongo。 tx-mongo的觀衆比pymongo小,所以它的文檔相當粗糙,但你應該能夠在example目錄中找到所需的全部內容。

背景:Threading vs Event programing

+0

好的,謝謝。但是我所做的只是使用collection.insert函數將文檔插入到集合中。我不需要看到這個電話的結果 - 它只是失火而忘了。假設我將這個調用包裝在python線程庫的一個線程中。這會造成問題嗎? – Marc 2014-08-28 22:32:10

+0

由於[GIL](http://en.wikipedia.org/wiki/Global_Interpreter_Lock)的原因,線程不太可能有幫助,除非您運行其他CPython。如果你的應用程序有很大的空間,你可能能夠逃脫pymongo的調用,只是它會失敗並且不合時宜(如果你忘記了這種欺騙方式,那麼它就會成爲調試的熊)。 https://github.com/fiorix/mongo-async-python-driver是我以前運氣不錯的原生mongo驅動程序,在做一些你會後悔的事情之前先看看它。 – 2014-08-28 23:06:24

+0

線程可能會有所幫助,因爲GIL是圍繞阻止CPython標準庫中實現的I/O操作發佈的。從本質上講,如果您使用Twisted,就像使用Twisted一樣,您可以通過使用帶多線程的阻塞API來獲得儘可能多的基於線程的併發性(換句話說,Twisted不會使線程變得更糟,不會讓他們變得更好)。 – 2014-08-29 01:18:52