12

我正在寻找可以发出异步请求的 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 或官方客户)。此外,我熟悉的两个将请求逻辑与响应处理逻辑结合起来,因此自己修改它们似乎很困难。也许一个足够的临时解决方案是使用请求的异步版本grequests

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

4

8 回答 8

9

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

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

于 2018-03-10T15:08:57.710 回答
3

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

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

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

于 2014-01-25T00:05:04.883 回答
2

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

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

于 2015-01-31T03:24:12.527 回答
1

ES有这个Tornado 异步客户端

于 2014-01-27T16:50:57.700 回答
1

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

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

于 2019-03-14T19:02:58.957 回答
0

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

https://github.com/jkoelker/txes

于 2014-02-06T03:53:48.947 回答
0

如果您使用的是扭曲的,那么Twistes是一个很好的库

于 2017-02-24T22:15:36.623 回答
-1

我的建议是坚持 CURLing 一切。有太多不同的方法、过滤器和查询,以至于各种“包装器”很难重新创建所有功能。在我看来,这类似于将 ORM 用于数据库……您在易用性方面获得的收益会在灵活性/原始能力方面有所损失。

试一试 CURL,看看它对你有什么影响。您可以使用外部 JSON 格式化程序来检查您的 JSON,使用邮件列表查找示例,如果您使用 JSON,则可以使用文档。

于 2014-02-16T04:39:20.503 回答