簡體   English   中英

什么是Tornado和Mongodb阻塞和異步注意事項?

[英]What are the Tornado and Mongodb blocking and asynchronous considerations?

我正在與Mongodb一起運行Tornado Web服務器(使用pymongo驅動程序)。 我正在嘗試做出架構決策以最大限度地提高性能。

在將Tornado和pymongo一起使用時,我有幾個關於生成的應用程序的阻塞/非阻塞和異步方面的子問題:

問題1:連接池

看來pymongo.mongo_client.MongoClient對象會自動實現一個連接池。 是“連接池”的預期目的,以便我可以從不同的線程同時訪問mongodb? 如果從單個線程運行單個MongoClient實例,那么確實沒有“池”,因為任何時候只能打開一個連接嗎?

問題2:多線程Mongo調用

以下FAQ:

http://api.mongodb.org/python/current/faq.html#does-pymongo-support-asynchronous-frameworks-like-gevent-tornado-or-twisted

狀態:

目前沒有很好的方法將PyMongo與Tornado或Twisted結合使用。 PyMongo提供了內置的連接池,因此只需編寫共享MongoClient的多線程代碼即可實現這些框架的一些好處。

所以我假設我只是將一個MongoClient引用傳遞給每個線程? 或者還有更多呢? 每個線程產生結果時觸發回調的最佳方法是什么? 我應該有一個線程運行誰的工作是觀察隊列(python的Queue.Queue )來處理每個結果,然后在Tornado中左側打開RequestHandler對象上調用finish() (當然需要使用tornado.web.asynchronous裝飾器)

問題3:多個實例

最后,我是否可能只是在創造工作? 我應該通過運行Tornado的單線程實例來快捷方式,然后每個核心啟動3-4個實例嗎? (上面的FAQ參考似乎暗示了這一點)

畢竟不是python中的GIL會導致有效的不同進程嗎? 或者Tornado的“非阻塞”方面還有其他性能考慮因素(正負)嗎? (我知道這在I / O方面是非阻塞的,如下所示: Tornado真的沒有阻塞嗎?

(附加說明:我知道asyncmongo在: https//github.com/bitly/asyncmongo但是想直接使用pymongo而不是引入這個額外的依賴。)

據我所知,網絡服務器有兩個概念:

  1. 基於線程(apache)
  2. 事件驅動(龍卷風)

你使用python進行GIL,GIL對線程不好,而事件驅動是一個只使用一個線程的模型,所以請選擇事件驅動。

Pymongo將阻止龍卷風,所以這里是建議:

  1. 使用Pymongo:使用它,通過制作索引使數據庫調用更快,但要注意; 索引不能用於掃描大量值的操作,例如: gte
  2. 使用AsyncMongo ,似乎已經更新,但仍然不是所有的mongodb功能。
  3. 使用Mongotor ,這個就像Asynchmongo的更新,它有ODM(對象文檔映射器),擁有MongoDB所需的所有東西(聚合,副本集......),你唯一真正想念的功能是GridFS。
  4. 使用Motor ,這是一個,是與Tornado一起使用的完整解決方案,它具有GridFS支持,並且它是Tornado的官方Mongodb異步驅動程序,它使用了使用Greenlet的hack,因此唯一的缺點是不能與PyPy一起使用。

現在,如果你決定其他解決方案而不是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM