【问题标题】:Is it possible to use fastapi with gremlin-python?是否可以将 fastapi 与 gremlin-python 一起使用?
【发布时间】:2020-10-13 22:25:50
【问题描述】:

我正在尝试将 fastapi 与 gremlin-python 一起使用。该库使用 tornado 作为连接到 gremlin 服务器的传输,特别是它使用 httpclient 和 websockets 以及 tornado 的ioloop

问题是 python 禁止嵌套事件循环,我得到运行时错误:https://pastebin.com/mcFhuKks 目前作为解决方法我使用nest_asyncio,但这是一个非常不可靠的解决方案。

由于之前我在这里看到了几个关于 asyncio 循环的问题(尽管主要是关于 aiohttp),我很好奇是否有一些简单的方法可以解决这个问题(例如,以某种方式重用父事件循环)。

我还想注意到 gremlin-python DB 连接构造函数支持传递自定义传输工厂(而不是 default),我尝试使用 asyncio.get_event_loop()asyncio.run_until_complete() 之类的东西而不是 tornado 的替代方案,但是没有运气。

因此,我在这里寻求任何想法或可能的解决方案。

  • FastAPI 版本:==0.61.1
  • Python 版本:python:3.8-slim

【问题讨论】:

  • 这可能由于初始化顺序而发生,因此 gremlin-client 和 tornado 创建自己的循环而不是使用已经创建的循环。如果您提供了mwe,建议解决方案会容易得多。

标签: python python-asyncio tornado fastapi gremlinpython


【解决方案1】:

tl;dr Nest_asyncio 解决方法现在由 gremlinpython 本身使用。


部分答案,希望对后来的人有用。

随着版本 3.5.0 的发布,gremlin-python(又名gremlinpython)已经放弃了龙卷风,转而支持 AIOHTTP。

来自the upgrade docs

Python 传输层

随着 Python 2.x 支持的移除,gremlin-python 的传输层已被重写,以使用利用 Python 3 的异步事件循环的库。AIOHTTP 使用 Python 3 的事件循环,具有最小的 HTTP 抽象,现在用于传输层。从用户的角度来看,除了现在通过命名参数提供了新的配置选项外,没有太大的变化,有关更多详细信息,请参阅 AIOHTTP ws_connect。此更改修复了与旧 Tornado 传输层的 IOLoop 相关的许多问题,该传输层已从库中完全删除。添加了一个额外的配置,可以在事件循环中使用驱动程序,并且可以通过在连接时设置 call_from_event_loop=True 来使用。

我对最后一行很感兴趣,所以我查看了call_from_event_loopUnder the hood,它只是使用nest_asyncio。从本质上讲,这是一种更符合人体工程学的方式来实现这个问题中已经提到的 nest_asyncio 解决方法。

【讨论】:

    【解决方案2】:

    只是一个糟糕的 gremlin 库架构。使用 websocket-client 创建了同步传输工厂,现在可以正常工作了。

    【讨论】:

      猜你喜欢
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 2016-04-01
      • 2011-01-20
      • 2018-08-11
      • 2021-08-05
      相关资源
      最近更新 更多