python - 是否可以将 fastapi 与 gremlin-python 一起使用?
问题描述
我正在尝试将 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
解决方案
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 解决方法。
推荐阅读
- javascript - 无法读取未定义 CompileError 的属性“toLowerCase”:从 CSS 选择器 .invert-color 开始
- assembly - 如何访问堆栈参数的值?
- contract - 合同验证错误:originEnergyLimit 必须 > 0。Tron ide 错误
- python-3.x - 如何停止在此单元格中打印图表,但下一个单元格的代码非常短
- reactjs - 嵌套应用程序的 IIS URL 重写
- javascript - 在 Chrome 和 Firefox 中调整图像大小时 contenteditable="true" 属性不适用于图像标签的解决方案
- python - PyPDF2.utils.PdfReadError:文件尚未解密
- java - 使用 SceneBuilder 在 JavaFX 项目开始时调用函数
- c++ - 谁能解释这个图像分辨率设置代码?到底发生了什么
- java - 在阻止模式下拨打电话