1

我正在尝试将 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()andasyncio.run_until_complete()而不是 tornado 的替代品,但没有运气。

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

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

2 回答 2

1

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


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

随着 3.5.0 版本的发布,gremlin-python(又名gremlinpython)已经放弃了 tornado,转而使用 AIOHTTP。

升级文档

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_loop. 幕后,它只是在使用nest_asyncio。从本质上讲,这是一种更符合人体工程学的方式来实现在这个问题上已经提到的 nest_asyncio 解决方法。

于 2021-08-26T22:03:49.177 回答
0

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

于 2020-10-15T15:38:38.580 回答