[英]What are the Tornado and Mongodb blocking and asynchronous considerations?
我正在與Mongodb一起運行Tornado Web服務器(使用pymongo驅動程序)。 我正在嘗試做出架構決策以最大限度地提高性能。
在將Tornado和pymongo一起使用時,我有幾個關於生成的應用程序的阻塞/非阻塞和異步方面的子問題:
看來pymongo.mongo_client.MongoClient
對象會自動實現一個連接池。 是“連接池”的預期目的,以便我可以從不同的線程同時訪問mongodb? 如果從單個線程運行單個MongoClient實例,那么確實沒有“池”,因為任何時候只能打開一個連接嗎?
以下FAQ:
狀態:
目前沒有很好的方法將PyMongo與Tornado或Twisted結合使用。 PyMongo提供了內置的連接池,因此只需編寫共享MongoClient的多線程代碼即可實現這些框架的一些好處。
所以我假設我只是將一個MongoClient
引用傳遞給每個線程? 或者還有更多呢? 每個線程產生結果時觸發回調的最佳方法是什么? 我應該有一個線程運行誰的工作是觀察隊列(python的Queue.Queue
)來處理每個結果,然后在Tornado中左側打開RequestHandler
對象上調用finish()
? (當然需要使用tornado.web.asynchronous
裝飾器)
最后,我是否可能只是在創造工作? 我應該通過運行Tornado的單線程實例來快捷方式,然后每個核心啟動3-4個實例嗎? (上面的FAQ參考似乎暗示了這一點)
畢竟不是python中的GIL會導致有效的不同進程嗎? 或者Tornado的“非阻塞”方面還有其他性能考慮因素(正負)嗎? (我知道這在I / O方面是非阻塞的,如下所示: Tornado真的沒有阻塞嗎? )
(附加說明:我知道asyncmongo在: https : //github.com/bitly/asyncmongo但是想直接使用pymongo而不是引入這個額外的依賴。)
據我所知,網絡服務器有兩個概念:
你使用python進行GIL,GIL對線程不好,而事件驅動是一個只使用一個線程的模型,所以請選擇事件驅動。
Pymongo將阻止龍卷風,所以這里是建議:
gte
現在,如果你決定其他解決方案而不是Tornado,如果你使用Gevent,那么你可以使用Pymongo,因為它被說成 :
PyMongo完全支持的唯一異步框架是Gevent。
NB:抱歉,如果沒有話題,但句子:
目前沒有很好的方法將PyMongo與Tornado結合使用
應該從文檔中刪除,Mongotor和Motor以完美的方式工作(特別是電機)。
你也知道電機嗎? : http ://emptysquare.net/blog/introducing-motor-an-asynchronous-mongodb-driver-for-python-and-tornado/由Jesse Davis撰寫,他是pymongo的合着者
雖然這個問題很老,但我覺得給出的答案並沒有完全解決用戶提出的所有問題。
如果從單個線程運行單個MongoClient實例,那么確實沒有“池”,因為任何時候只能打開一個連接嗎?
如果您的腳本不使用線程,這是正確的。 但是,如果您的腳本是多線程的,那么在給定時間將打開多個連接
最后,我是否可能只是在創造工作? 我應該通過運行Tornado的單線程實例來快捷方式,然后每個核心啟動3-4個實例嗎?
不,你不是! 創建多個線程比多個線程的資源密集程度更低。
畢竟不是python中的GIL會導致有效的不同進程嗎?
GIL僅阻止多個線程同時訪問解釋器。 不會阻止多個線程同時執行I / O. 事實上,這正是asyncio的運動如何實現異步性。
它使用線程池執行程序為每個查詢生成一個新線程,在線程完成時返回結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.