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

时间:2013-10-09 18:56:01

标签: 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()

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

此外,值得指出的是ElasticSearch的{​​{1}}可能是性能更好的选项,但对于实际应用程序,它需要进行一些代码重组。

8 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:2)

我已将txes分为txes2。它具有更多PEP8友好界面,测试覆盖范围(单元和集成)以及对ES v1.x的支持。

仍在进行中,但对于使用Twisted的人来说可能是个不错的选择。

答案 3 :(得分:1)

答案 4 :(得分:0)

我还没用过它,但我发现了这个:

https://github.com/jkoelker/txes

答案 5 :(得分:0)

如果你使用twisted

Twistes是一个很好的库

答案 6 :(得分:0)

这是一个比较老的问题,但是现在在2019年,有正式的异步包装程序包。 https://github.com/elastic/elasticsearch-py-async

我在针对ES 5.x的使用上取得了成功,但是问题是5.x分支没有得到维护https://github.com/elastic/elasticsearch-py-async/issues/46

答案 7 :(得分:-1)

我的建议是坚持使用CURLing。有许多不同的方法,过滤器和查询,各种“包装器”很难重新创建所有功能。在我看来,它类似于使用ORM进行数据库...你在易用性方面获得的东西会失去灵活性/原始力量。

暂时尝试一下CURL,看看它对你有何看法。您可以使用外部JSON格式化程序检查您的JSON,邮件列表以查找示例,如果您使用JSON,文档也可以。