是否有支持异步请求的Python ElasticSearch客户端?

gat*_*ado 9 python asynchronous elasticsearch

我正在寻找一个可以发出异步请求的ElasticSearch Python客户端.例如,我想写这段代码,

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()
Run Code Online (Sandbox Code Playgroud)

但是,我没有看到支持这个的任何客户端(例如PyES或官方客户端).此外,我熟悉的两个请求逻辑与响应处理逻辑耦合,因此自己修改它们似乎很困难.也许一个充分的临时解决方案是使用异步版本的Requests,grequests

此外,值得指出的是ElasticSearch _msearch可能是性能更好的选择,但对于实际应用程序,它需要一些代码重组.

Tom*_*art 6

刚遇到这个问题。有一个基于asyncio的官方异步Elasticsearch客户端:

https://github.com/elastic/elasticsearch-py-async

  • 嘿!我在 Elastic 维护 Python 客户端。上面提到的包已被弃用,将 Asyncio 与 Elasticsearch 结合使用的官方方法是通过“elasticsearch”包中的 AsyncElasticsearch:https://elasticsearch-py.readthedocs.io/en/master/async.html (3认同)

lua*_*art 3

您还可以考虑以下选项来执行 I/O,而不使用现有客户端阻止主执行进程:

  • 在 Jython 或 IronPython 上使用多线程(它们没有 GIL 并利用多个 CPU 核心)
  • 在 Python3 上使用 ProcessPoolExecutor
  • 将gevent与套接字猴子路径结合使用,强制现有客户端使用 gevent套接字,这实际上使客户端异步,但也请求一些额外的代码来管理结果

Gevent 的使用是最轻量级的(对于 RAM/CPU 资源),并且允许处理最密集的 I/O,但它也是列出的解决方案中最复杂的。另请注意,它在单进程中工作,并且要利用多核多处理包的优势。