2011-08-23 13 views
13

晨間需要在pymongo多個領域的專業知識比我現在所擁有的:pymongo + gevent:扔我一根香蕉,只是monkey_patch?這裏

是用Python編寫的對我pymongo驅動程序的「權利」部分調用GEVENT monkey_patch(),併成功地改變pymongo的阻塞於r行爲/ w內gevent「異步」greenlets?

如果這需要在gevent和pymongo上做更多的工作 - 但這是可行的 - 只要我能夠對irc有一點指導,我就會樂於投入時間。

謝謝!

注意:在小規模mongo寫入不是一個大問題,因爲我們只是在解鎖前排隊寫入「請求」。但是與fiorix談論他的扭曲的異步mongo驅動程序(https://github.com/fiorix/mongo-async-python-driver),即使是mongo的快速寫入(請求)也會在異步應用程序中導致問題。 (當然,非阻塞讀取可能會導致從一開始就出現的問題!)

回答

18

是你需要注意的幾件事情:

只有一個 pymongo.Connection
  1. 實例化對象,preferrably爲全局或模塊級變量。這很重要,因爲Connection本身就有一個游泳池!
  2. 猴子修補所有東西,或者至少都是套接字和線程。由於在Connection中使用了線程局部變量,單獨修補套接字是不夠的。
  3. 請記得撥打end_request將連接返回到池。

您的問題的答案是繼續,PyMongo在Gevent中工作得很好。

+0

感謝Bernie Hackett在mongodb谷歌組上進行此次更新: 還有一個問題,即mongo的連接池的上限遠低於大多數應用程序在將要產生的greenlet的數量時,如果他們使用mongo第一名(綠色小時1000)。 一些最新的mongodb補丁在這裏https://github.com/mgood/mongo-python-driver是爲了讓gevent和mongo的線程池很好地配合。 下面是*可能工作的補丁的另一個示例:http://code.activestate.com/recipes/577490-mongodb-pool-for-gevent-and-pymongo-packages/。 – egbutter

+0

你有沒有或者知道PyMongo與Gevent一起使用的例子? –

+0

這裏還有一個補丁可以工作的另一個例子:https://gist.github.com/1184264 – kkurian

2

在初始檢查時,它似乎沒有在c代碼中做任何套接字操作,所以它應該沒問題(阻塞操作應該阻止綠線)。我已經使用PyMongo與GEVENT這裏