2013-01-08 33 views
0

所以我有在網絡上的幾臺計算機上運行的MongoDB:我如何線程我的遠程MongoDB調用?

  • 我可以很容易地編寫代碼,從我的電腦連接到一個和返回結果集,例如:
from pymongo import Connection 
c = Connection("10.130.10.12") 
some_data = c.MyData.MyCollection.find_one() 
  • 如果我有,說100級的服務器連接到,並希望把這個循環,那太容易了:
all_data = [] 
for server in my_list_of_servers: 
    c = Connection(server) 
    all_data.append(c.MyData.MyCollection.find_one()) 
  • 然而,這是一個接一個,可能會很慢。
  • 如何一次發送所有請求?我與線程超級陌生的(是我應該甚至可以尋找到?)

回答

2
from multiprocessing import Pool 

def connectAndCollect(server): 
    c = Connection(server) 
    return c.MyData.MyCollection.find_one() 

pool = Pool(processes=10) 
res = pool.map(connectAndCollect,servers) 
map(lambda x: all_data.append(x),res) 
pool.close() 

的多庫是專爲這種任務的。如果你喜歡,最後的map調用可以用for循環代替。

採用多模塊地圖的描述/ Reduce任務一般被描述如下: http://mikecvet.wordpress.com/2010/07/02/parallel-mapreduce-in-python/

+0

謝謝!但是pool.map不能接受這個函數? PicklingError:不能鹹菜<類型「功能」>:屬性查找__builtin __ FUNC重刑失敗 – LittleBobbyTables

+1

**編輯** 因爲我傻,我認爲不可能辦到的事: http://stackoverflow.com/questions/ 4827432/how-to-let-pool-map-take-a-lambda-function 不要在'pool.map'中使用lambdas。無論如何,這個最終的積累步驟不會真正從多處理中受益。 – alexplanation

+0

宇!它的工作原理^ _^ 雖然'res'的簡稱是什麼?另外,我更熟悉列表推導而不是地圖 - 可以將這行:map(lambda x:all_data.append(x),res)'替換爲這個列表理解:'all_data.append([x for x in ']。它們在功能/內存方面是否相同? (對不起!很多問題) – LittleBobbyTables