2013-10-09 164 views
8

我正在尋找可以發出異步請求的ElasticSearch Python客戶端。例如,我想編寫此代碼,是否有支持異步請求的Python ElasticSearch客戶端?

query1_future = es.search('/foobar', query1_json) 
query2_future = es.search('/baz', query2_json) # Submit query 2 right after query 1, don't wait for its response 
query1 = query1_future.get() 
query2 = query2_future.get() 

不過,我沒有看到任何的客戶端(PyES,或official client,例如)支持這一點。此外,我熟悉的兩種方法將請求邏輯與響應處理邏輯耦合起來,因此自己修改它們似乎很困難。也許一個足夠的臨時解決方案是使用異步版本的請求grequests?另外,值得指出的是ElasticSearch的_msearch可能是一個更好的選擇,但是對於真實世界的應用程序來說,它需要一些代碼重組。

回答

2

你也可以考慮以下選項來執行I/O,而無需使用存在客戶端阻塞主要執行過程:

  • 使用多線程的Jython或IronPython的(他們沒有GIL和利用多個CPU內核的)
  • 使用ProcessPoolExecutor上Python3
  • 使用gevent與插座monkey pathching逼存在clients work with gevent插口,實際上使客戶端異步也要求一些額外的代碼來管理結果

Gevent的使用是最輕量級的(RAM/CPU資源),並允許處理最密集的I/O,但它也是列出的解決方案中最複雜的。另外請注意,它在單個進程中工作,並使用多個內核的優勢multiprocessing應該被使用。

0

我的建議是隻是捲曲一切堅持。有很多不同的方法,過濾器和查詢使得各種「包裝器」很難重新創建所有的功能。在我看來,它類似於對數據庫使用ORM ......您在易用性方面獲得的優勢會喪失靈活性/原始功能。

讓CURL嘗試一段時間,看看如何對待你。您可以使用外部JSON格式化程序檢查您的JSON,查找郵件列表以查找示例,如果使用JSON,則文檔可以正常使用。

1

我把分叉txes分成txes2。它具有更多的PEP8友好界面,測試範圍(單元和集成)以及對ES v1.x的支持。

仍在研究中,但對於使用Twisted的人來說可能是一個不錯的選擇。

相關問題