无法将可等待传递给 asyncio.run_coroutine_threadsafe

2024-03-27

我观察到asyncio.run_coroutine_threadsafe函数不接受一般的可等待对象,我不明白这种限制的原因。观察

import asyncio


async def native_coro():
    return


@asyncio.coroutine
def generator_based_coro():
    return


class Awaitable:
    def __await__(self):
        return asyncio.Future()


loop = asyncio.get_event_loop()

asyncio.run_coroutine_threadsafe(native_coro(), loop)
asyncio.run_coroutine_threadsafe(generator_based_coro(), loop)
asyncio.run_coroutine_threadsafe(Awaitable(), loop)

使用 Python 3.6.6 运行它会产生结果

Traceback (most recent call last):
  File "awaitable.py", line 24, in <module>
    asyncio.run_coroutine_threadsafe(Awaitable(), loop)
  File "~/.local/python3.6/lib/python3.6/asyncio/tasks.py", line 714, in run_coroutine_threadsafe
    raise TypeError('A coroutine object is required')
TypeError: A coroutine object is required

其中第 24 行是asyncio.run_coroutine_threadsafe(Awaitable(), loop).

我知道我可以将可等待对象包装在定义如下的协程中

awaitable = Awaitable()

async def wrapper():
    return await awaitable

asyncio.run_coroutine_threadsafe(wrapper(), loop)

然而我的期望是等待将是直接有效的论点run_coroutine_threadsafe.

我的问题是:

  1. 这个限制的原因是什么?
  2. Is the wrapper上面定义的函数是传递可等待的最传统方法run_coroutine_threadsafe以及其他需要的 APIasync def或者生成器定义的协程?

这个限制的原因是什么?

看着执行 https://github.com/python/cpython/blob/98b976a2f82ba5f50cf6846338f644ca6c64f47d/Lib/asyncio/tasks.py#L821,原因肯定不是技术性的。由于代码已经调用ensure_future(而不是说,create_task),它会自动工作,并且在任何可等待的对象上正确工作。

限制原因可以在跟踪器上找到。该功能于 2015 年添加,原因是拉取请求 https://github.com/python/asyncio/pull/273。在相关讨论中业务流程外包问题 https://bugs.python.org/issue25304提交者明确请求将函数重命名为ensure_future_threadsafe(平行于ensure_future)并接受任何类型的等待,这是尤里·塞利瓦诺夫(Yury Selivanov)附议的立场。然而,吉多against https://bugs.python.org/msg252270想法:

我反对这个想法。不管怎样,我并没有真正看到这种方法有多么重要的未来:它只是线程世界和异步世界之间的一点粘合剂,人们将通过查找示例来学习如何使用它。

[...]

但老实说我don't希望鼓励在线程和事件循环之间来回翻转;我认为这是一种必要的罪恶。从在线程世界中编码的某人想要将某些内容移交给异步世界的人的角度来看,我们目前使用的名称很好。

为什么线程世界中的某人需要等待 asyncio.future?听起来他们正在混淆这两个世界——或者他们应该编写异步代码而不是线程代码。

还有其他类似的评论,但以上内容几乎总结了这一论点。

Is the wrapper上面定义的函数是传递可等待的最传统方法run_coroutine_threadsafe以及其他需要异步 def 或生成器定义的协程的 API?

如果您确实需要一个协程对象,例如wrapper这无疑是一种简单而正确的获取方法。

如果您创建包装器的唯一原因是调用run_coroutine_threadsafe,但你实际上对结果或concurrent.futures.Future由返回run_coroutine_threadsafe,您可以通过调用来避免换行call_soon_threadsafe直接地:

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

无法将可等待传递给 asyncio.run_coroutine_threadsafe 的相关文章

  • OutOfRangeError(请参阅上面的回溯):FIFOQueue '_1_batch/fifo_queue' 已关闭并且元素不足(请求 32,当前大小 0)

    我在使用队列中张量流读取图像时遇到问题 请让我知道我犯了什么错误 下面是代码 import tensorflow as tf slim tf contrib slim from tensorflow python framework imp
  • 如何检查当前日期并移至下一个日期

    我遇到了一个我似乎无法理解的 python 问题 不确定是否需要使用 if 语句 但因为我是 python 新手 所以我实际上不确定如何编写这个小问题 事实上 这就是我遇到的问题 对于出发日历 我希望 python 能够执行以下操作 查看
  • 导入错误:无法导入名称“PandasError”

    我对在 Mac 上运行的 Python 3x 非常陌生 当前使用 python 金融的 senddex 教程 尝试运行以下脚本 import datetime as dt import matplotlib pyplot as plt fr
  • 二进制数据的Python字符串表示

    我试图理解 Python 显示表示二进制数据的字符串的方式 这是一个使用的示例乌兰多姆操作系统 http docs python org library os html os urandom In 1 random bytes os ura
  • matplotlib:在次要标签下绘制主要刻度标签

    这看起来应该很容易 但我不知道该怎么做 我有一个 X 轴上有时间的图 我想设置两组刻度 小刻度显示一天中的小时 大刻度显示日 月 所以我这样做 set date ticks to something sensible xax ax get
  • 通过 rpy 将 SPSS 文件(.sav)导入 pandas 时如何保留标签?

    我正在寻找使用 SPSS 文件 sav pandas 在没有 SPSS 程序的情况下 典型文件转换为 csv 后的样子如下 在调查前两行的含义时 我不知道 SPSS 似乎第一行包含Labels 而第二行包含VarNames 当我将文件带入
  • 可以memmap pandas系列。数据框怎么样?

    看来我可以通过创建 mmap d ndarray 并使用它来初始化系列来对 python 系列的底层数据进行内存映射 def assert readonly iloc try iloc 0 999 Should be non editabl
  • 在 python 中查找价格动量的有效方法:对列的最后 n 个条目求平均值

    我正在定义价格动量是给定股票过去动量的平均值n days 反过来 动量是一种分类 如果当天的收盘价高于前一天 则每天标记为 1 如果当天的收盘价低于前一天 则标记为 1 我的库存变化百分比如下 df close in percent np
  • 从内存中发送图像

    我正在尝试为 Discord 机器人实现一个系统 该系统可以动态修改图像并将其发送给机器人用户 为此 我决定使用 Pillow PIL 库 因为它对于我的目的来说似乎简单明了 这是我的工作代码的示例 它加载一个示例图像 作为测试修改 在其上
  • 参数太少错误,同时未使用参数占位符

    我尝试使用 PYODBC 在 Access 数据库中执行 SQL 查询 但出现以下错误 pyodbc Error 07002 07002 Microsoft ODBC Microsoft Access 驱动程序 参数太少 预期为 1 301
  • Python 排列(包括子字符串)

    我遇到过这个帖子 如何在Python中生成列表的所有排列 https stackoverflow com questions 104420 how to generate all permutations of a list in pyth
  • python matplotlib 使用按钮事件添加和删除图形中的文本

    我试图在调用button press event 时将文本添加到鼠标指针位置的图形中 并在调用button release event 时将其删除 我已成功添加文本 但无法将其删除 这是我使用的代码的一部分 def onclick even
  • Django - 该进程无法访问该文件,因为该文件正在被另一个进程使用

    我正在尝试在 Windows 10 上运行 Django 我是 Django 的新手 我正在使用 Compressor Toolkit 我的问题是 我可以运行 manage py 但本地主机说 base html 第 9 行出错该进程无法访
  • 更新或插入 MySQL Python

    如果记录已存在 我需要更新一行 如果不存在 我需要创建一个新记录 我理解 ON DUPLICATE KEY 将使用 MYSQLdb 完成此操作 但是我无法使其正常工作 我的代码如下 cursor database cursor cursor
  • 创建 df 以生成给定格式的 json

    我正在尝试生成一个 df 来生成下面的 json Json数据 name flare children name K1 children name Exact size 4 name synonyms size 14 name K2 chi
  • 我无法设置顶级标题

    我想为 TopLevel 设置标题 但 TopLevel 显示 Root 的标题 我认为我的下一个脚本与 TkInter 文档中的示例相对应 但给了我不好的结果 你能解释一下 为什么我的设置master title 顶部 in 应用程序顶部
  • Python 用静态图像将 mp3 转换为 mp4

    我有x文件包含一个列表mp3我想转换的文件mp3文件至mp4文件带有static png photo 似乎这里唯一的方法是使用ffmpeg但我不知道如何实现它 我编写了脚本来接受输入mp3文件夹和一个 png photo 然后它将创建新文件
  • 访问 Scrapy 内的 django 模型

    是否可以在 Scrapy 管道内访问我的 django 模型 以便我可以将抓取的数据直接保存到我的模型中 我见过this https scrapy readthedocs org en latest topics djangoitem ht
  • 将非方邻接矩阵导入 Networkx python

    我在下面有一些 pandas 数据框形式的数据 其中列代表离散技能 行代表离散工作 仅当工作需要该技能时才存在 1 否则为 0 skill 1 skill 2 job 1 1 0 job 2 0 0 job 3 1 1 我想使用 netwo
  • matplotlib imshow() 和像素强度

    我试图了解矩阵的值是如何输入到 matplotlib 的imshow 函数确定灰度模式下像素的强度 考虑示例代码 import random import matplotlib pyplot as plt import matplotlib

随机推荐