Python:当已经有一个事件循环正在运行时,从同步方法调用异步代码[重复]

2024-01-01

我正在使用 FastAPI 和 uvloop 以有效的方式提供 REST API。

我有很多异步代码来调用远程资源,例如数据库、存储等,这些函数如下所示:

async def _get_remote_resource(key: str) -> Resource:
    # do some async work
    return resource

我正在实现一个现有抽象基类的接口,我需要在同步方法中使用上面的异步函数。我做过类似的事情:

class Resource:
     def __str__(self):
         resource = asyncio.run_until_complete(_get_remote_resource(self.key))
         return f"{resource.pk}"

伟大的!现在我在 fastapi 中创建一个端点以使这项工作可访问:

@app.get("")
async def get(key):
     return str(Resource(key))

问题是 FastAPI 已经使用 uvloop 运行事件循环,然后异步代码失败,因为循环已经在运行。

有什么方法可以从类中的同步方法调用异步方法吗?或者我必须重新考虑代码的结构?


运行时错误的设计正是为了防止您尝试执行的操作。run_until_complete是一个阻塞调用,在 async def 中使用它会停止外部事件循环。

简单的解决方法是通过实际的异步方法公开所需的功能,例如:

class Resource:
    def name(self):
        return loop.run_until_complete(self.name_async())

    async def name_async(self):
        resource = await _get_remote_resource(self.key)
        return f"{resource.pk}"

然后在 fastapi 中,您可以以本机方式访问 API:

@app.get("")
async def get(key):
     return await Resource(key).name_async()

您还可以定义__str__(self)回来self.name(),但最好避免这种情况,因为像这样基本的事情str()也应该可以从 asyncio 内部调用(由于用于日志记录、调试等)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:当已经有一个事件循环正在运行时,从同步方法调用异步代码[重复] 的相关文章

  • 保存为 HDF5 的图像未着色

    我目前正在开发一个将文本文件和 jpg 图像转换为 HDF5 格式的程序 用HDFView 3 0打开 似乎图像仅以灰度保存 hdf h5py File Sample h5 img Image open Image jpg data np
  • 使用特定的类/函数预加载 Jupyter Notebook

    我想预加载一个笔记本 其中包含我在另一个文件中定义的特定类 函数 更具体地说 我想用 python 来做到这一点 比如加载一个配置文件 包含所有相关的类 函数 目前 我正在使用 python 生成笔记本并在服务器上自动启动它们 因为不同的
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 使用 Python 从文本中删除非英语单词

    我正在 python 上进行数据清理练习 我正在清理的文本包含我想删除的意大利语单词 我一直在网上搜索是否可以使用像 nltk 这样的工具包在 Python 上执行此操作 例如给出一些文本 Io andiamo to the beach w
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 为什么 PyYAML 花费这么多时间来解析 YAML 文件?

    我正在解析一个大约 6500 行的 YAML 文件 格式如下 foo1 bar1 blah name john age 123 metadata whatever1 whatever whatever2 whatever stuff thi
  • Python 2:SMTPServerDisconnected:连接意外关闭

    我在用 Python 发送电子邮件时遇到一个小问题 me my email address you recipient s email address me email protected cdn cgi l email protectio
  • Python beautifulsoup 仅限 1 级文本

    我看过其他 beautifulsoup 得到相同级别类型的问题 看来我的有点不同 这是网站 我正试图拿到右边那张桌子 请注意表的第一行如何展开为该数据的详细细分 我不想要那个数据 我只想要最顶层的数据 您还可以看到其他行也可以展开 但在本例
  • 在Python中检索PostgreSQL数据库的新记录

    在数据库表中 第二列和第三列有数字 将会不断添加新行 每次 每当数据库表中添加新行时 python 都需要不断检查它们 当 sql 表中收到的新行数低于 105 时 python 应打印一条通知消息 警告 数量已降至 105 以下 另一方面
  • Docker 中的 Python 日志记录

    我正在 Ubuntu Web 服务器上的 Docker 容器中测试运行 python 脚本 我正在尝试查找由 Python Logger 模块生成的日志文件 下面是我的Python脚本 import time import logging
  • pyspark 将 twitter json 流式传输到 DF

    我正在从事集成工作spark streaming with twitter using pythonAPI 我看到的大多数示例或代码片段和博客是他们从Twitter JSON文件进行最终处理 但根据我的用例 我需要所有字段twitter J
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 加快网络抓取速度

    我正在使用一个非常简单的网络抓取工具抓取 23770 个网页scrapy 我对 scrapy 甚至 python 都很陌生 但设法编写了一个可以完成这项工作的蜘蛛 然而 它确实很慢 爬行 23770 个页面大约需要 28 小时 我看过scr
  • 从 NumPy ndarray 中选择行

    我只想从 a 中选择某些行NumPy http en wikipedia org wiki NumPy基于第二列中的值的数组 例如 此测试数组的第二列包含从 1 到 10 的整数 gt gt gt test numpy array nump
  • 实现 XGboost 自定义目标函数

    我正在尝试使用 XGboost 实现自定义目标函数 在 R 中 但我也使用 python 所以有关 python 的任何反馈也很好 我创建了一个返回梯度和粗麻布的函数 它工作正常 但是当我尝试运行 xgb train 时它不起作用 然后 我
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • 使用 z = f(x, y) 形式的 B 样条方法来拟合 z = f(x)

    作为一个潜在的解决方案这个问题 https stackoverflow com questions 76476327 how to avoid creating many binary switching variables in gekk
  • Kivy - 单击按钮时编辑标签

    我希望 Button1 在单击时编辑标签 etykietka 但我不知道如何操作 你有什么想法吗 class Zastepstwa App def build self lista WebOps getList layout BoxLayo

随机推荐

  • 从绝对路径获取流?

    我有这个方法 public RasImage Load Stream stream 如果我想加载一个像这样的网址 string url http localhost Application1 Images Icons hand jpg 我怎
  • ASP.NET MVC 的 Windows Azure 存储模拟器连接字符串?

    我正在搜索需要定义才能使用 Windows Azure 存储模拟器的连接字符串 到目前为止 我找到的所有消息来源都表明这些连接字符串应该转到ServiceDefinition and ServiceConfiguration文件位于 Win
  • NSDictionary 的 objectForKey: 依赖于同一性还是相等性?

    假设我有一个名为Person拥有以下财产socialSecurityNumber 并且这个类覆盖了isEqual 当社会保障号属性相等时返回 true 的方法 并说我已经放了一堆实例Person进入一个NSDictionary 如果我现在实
  • Angular CLI (7.0.5) 用于开发和生产的不同资产?

    是否可以使用 Angular CLI 7 0 5 使用不同的资产进行开发和生产 对于生产我想要资产 assets projects example src favicon ico 为了发展我想要资产 assets projects exam
  • Python 将日期时间小时设置为特定时间

    我试图将日期定为昨天晚上 11 30 这是我的代码 import datetime yesterday datetime date today datetime timedelta days 1 PERIOD yesterday strft
  • 外部混洗:从内存中混洗大量数据

    我正在寻找一种方法来整理内存不适合的大量数据 大约 40GB 我有大约 3000 万个可变长度的条目 存储在一个大文件中 我知道该文件中每个条目的开始和结束位置 我需要对内存中不适合的数据进行洗牌 我想到的唯一解决方案是对包含以下数字的数组
  • 在 bash 脚本中运行 tail -f 特定时间

    我需要一个可以运行一系列的脚本tail f命令并将它们输出到文件中 我需要的是为了tail f运行一定的时间来 grep 特定的单词 之所以是一定时间 是因为其中一些值不会立即显示 因为这是实时日志 我怎样才能运行这样的东西 比如说 20
  • 引用 LSF 作业数组中的作业索引

    我试图将作业数组中作业的索引作为参数传递给另一个 bash 脚本 numSims 3 numTreatments 6 uses numTreatments top rows of parameters csv maxFail 10 j 1
  • 如何获取 apache kafka 中的所有主题?

    RequestMapping value getTopics method RequestMethod GET ResponseBody public Response getAllTopics ZkClient zkClient new
  • 触发点击事件在 IE10 中不起作用[重复]

    这个问题在这里已经有答案了 我需要添加onclick事件到图像 因此当我单击图像时 它将触发文件打开对话框 但在 IE10 下不起作用 button on click function upload trigger click upload
  • 创建适合以下参数的假数据集:N、平均值、标准差、最小值和最大值

    有没有办法创建一个适合以下参数的假数据集 N 平均值 标准差 最小值和最大值 我想创建一个包含 187 个整数比例分数的样本 其平均值为 67 标准差为 17 观察值在 30 210 范围内 我正在尝试演示有关统计功效的概念课程 并且我想创
  • C语言如何跳过文件的前两行?

    我是 C 编程新手 我很困惑如何跳过文件中的前两行 我尝试使用fgets and fscanf 但我不知道该怎么做 假设我有一个文件txt像这样 1 Username Test 2 Password 12345 3 4 那么如何从第 3 行
  • 在 Linux 上用 C++ 移动文件的更快方法

    我正在尝试使用 C 在 Linux 上移动文件 问题是 源文件和目标文件夹可能位于不同的分区 所以我不能简单地移动文件 好的 我决定复制该文件并删除旧文件 bool copyFile string source string destina
  • 非阻塞 tun/tap 文件描述符上的 read() 收到 EAGAIN 错误

    我想从非阻塞 tun tap 文件描述符读取 IP 数据包tunfd我设置了tunfd作为非阻塞并在 libevent 中为其注册 READ EV 事件 当事件触发时 我先读取前20个字节来获取IP头 然后 阅读其余部分 nr bytes
  • MS Access 使用 Group By 进行舍入精度

    为什么员工每个月的平均得分相加后不等于员工 曾经 的平均得分 Average SELECT Avg r score AS rawScore FROM ET INNER JOIN Employee AS e ON ET employeeId
  • 数据注释隐藏属性/字段

    我有一个模型 class Address public int AddressID get set public string Street get set public string City get set public string
  • 从 R 中的分钟数据创建 15 分钟的时间间隔?

    我有一些数据 其格式如下 time count 00 00 17 00 01 62 00 02 41 所以我有从 00 00 到 23 59 的时间 并且每分钟有一个计数器 我想以 15 分钟为间隔对数据进行分组 这样 time count
  • ListTile可以设置边框吗? (扑)

    如何设置边框ListTile小部件 文档中没有它的属性 装饰 所以我不能像往常一样为这个元素应用边框 我也无法包装 ListTile 的属性 例如标题 副标题 前导 尾随在容器中 因为它不起作用 然而 如果没有任何巧妙的方法来设置带有边框的
  • 防止 之后换行

    In span HTML 叙述流中的元素 为了扩展检测到点击的区域 某些跨度仅包含一个字符的内容 我在定义为的类中添加填充 用负边距抵消它 expand click area display inline block padding 5px
  • Python:当已经有一个事件循环正在运行时,从同步方法调用异步代码[重复]

    这个问题在这里已经有答案了 我正在使用 FastAPI 和 uvloop 以有效的方式提供 REST API 我有很多异步代码来调用远程资源 例如数据库 存储等 这些函数如下所示 async def get remote resource