同步调用协程

2024-03-05

想象一下以下非常常见的情况:您编写了一个又长又复杂的函数,并意识到一些代码应该提取到一个单独的函数中以便重用和/或可读。通常,这个额外的函数调用不会改变程序的语义。

但是,现在假设您的函数是一个协程,并且您要提取的代码至少包含一个异步调用。现在,将其提取到一个单独的函数中,通过插入一个新点来突然改变程序语义,在该点上协程产生,事件循环进行控制,并且可以在其间安排任何其他协程。

之前的例子:

async def complicated_func():
    foo()
    bar()
    await baz()

之后的示例:

async def complicated_func():
    foo()
    await extracted_func()

async def extracted_func():
    bar()
    await baz()

在之前的例子中,complicated_func保证在调用之间不会被暂停foo()并打电话bar()。重构后,这种保证就消失了。

我的问题是:可以打电话吗extracted_func()这样它就会立即执行,就好像它的代码是内联的一样?或者是否有其他方法可以在不更改程序语义的情况下执行此类常见的重构任务?


重构后,这种保证就消失了。

其实不是。

是否可以调用extracted_func(),使其立即执行,就好像其代码是内联的一样?

情况已经如此了。

await some_coroutine()意思是some_coroutine可能会将控制权交还给事件循环,但直到它真正等待未来(例如某些 I/O 操作)时才会这样做。

考虑这个例子:

import asyncio

async def coro():
    print(1)
    await asyncio.sleep(0)
    print(3)

async def main():
    loop.call_soon(print, 2)
    await coro()

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

注意如何2之间打印1 and 3正如预期的那样。

这也意味着可以通过编写以下代码来冻结事件循环:

async def coro():
    return

async def main():
    while True:
        await coro()

在这种情况下,事件循环永远没有机会运行另一个任务。

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

同步调用协程 的相关文章

随机推荐

  • Docker-compose 链接与 external_links

    我相信这是一个简单的问题 但我仍然没有从 Docker compose 文档中得到它 链接和外部链接有什么区别 我喜欢 external links 因为我想要核心 docker compose 并且我想在不覆盖核心链接的情况下扩展它 我到
  • MongoParseError:URI 没有主机名、域名和 tld

    当我尝试将我的应用程序 nodejs 连接到 mongodb 时 出现此错误 我真的很感谢你在这里的帮助 MongoParseError URI does not have hostname domain name and tld at p
  • Android 旋转提示

    我有一个问题android prompt对于一个旋转器 我在 XML 文件中使用了以下代码 但它不起作用
  • 保存和加载数据(iphone sdk)

    我想知道在 iPhone 应用程序中保存和加载数据的最佳方法是什么 我正在尝试将字符串保存到文本文件或类似的文件中 然后将它们加载到表视图中 以便文本文件中的第一个条目是表视图中的第一行 依此类推 有人有一个想法我怎么能意识到这一点 提前致
  • npm 安装期间 libssh2 中“C 编译器无法创建可执行文件”

    我在 npm install 期间遇到以下错误nodegit http www nodegit org gt email protected cdn cgi l email protection preinstall home mhu no
  • 通过 SQL 身份验证连接时如何获取域用户名

    我有一个连接到 SQL Server 2000 的应用程序 使用通用 SQL 登录和 SQL 身份验证 我想通过触发器实现一些日志记录来跟踪数据更改 我不能使用USER NAME 因为这会返回通用帐户 我已经翻阅过master syspro
  • 从 S3 下载工件时代码构建访问被拒绝

    我的 CodeBuild 配置有 CodePipeline S3是我的神器商店 尽管已附加具有足够访问权限的 IAM 角色 但我仍然收到访问被拒绝消息 错误消息的屏幕截图 我已经检查了与 Codebuild 关联的服务角色 它附有以下政策
  • 增加子图之间的距离

    我有以下代码 digraph g graph rankdir LR compound true subgraph cluster0 graph label Ready n nAllowed Purchaser Operations nope
  • 我做的 df.Merge 错了吗?

    所以我有一个 df1 看起来有这一行 PlayDate Timeslot UserID 2005 09 09 6 16 1 59 我有 df2 其中包含 UserID PlayDate Timeslot PlayCount EstProb
  • 如何在Java中将HTTP状态码转换为文本?

    如何在 Java 中将 HTTP 状态代码转换为其文本表示形式 我的意思是是否有此类转换的现有实现 到目前为止我发现的最好的是java ws rs core Response Status fromStatusCode 它仅转换所有状态的有
  • C 和 C++ 中的快速 7x7 2D 中值滤波器

    我正在尝试将以下代码从 MATLAB 转换为 C function data process data data medfilt2 data 7 7 symmetric mask fspecial gaussian 35 35 12 dat
  • java中管道模式的实现

    阅读有关管道模式的信息here http parlab eecs berkeley edu wiki media patterns pipeline v1 pdf 如何在java中实现管道模式 有没有使用管道模式的开源java项目 关于 如
  • macOS 上的通用链接

    从 iOS9 开始 通用链接可以在 iOS 上使用 但我想知道 macOS 上是否有类似的东西 我们有一个应用程序 它是带有相应 Web 应用程序的 macOS 应用程序 我们希望用户单击链接在 Mac 应用程序中打开 而不是使用目标链接打
  • 如何跨多个 Pull Request 并行运行持续集成?

    我正在测试 Jenkins 的使用Github 拉取请求构建器插件 https wiki jenkins ci org display JENKINS GitHub pull request builder plugin我已经在 Githu
  • 处理已弃用的 android.text.ClipboardManager

    android text ClipboardManager自 API 级别 11 起已弃用 并替换为android content ClipboardManager source http developer android com ref
  • Tkinter:没有标题栏但可调整大小的窗口

    我知道的是 如果我想创建一个没有标题栏的窗口 我可以写 root Tk root overrideredirect 1 但我也希望窗口可以调整大小 有什么解决办法吗 仅供参考 我正在 Windows 机器上工作 尽管我不确定这是否真的重要
  • JAX-RS:如何以 JSON 形式返回对象列表?

    我查看了文档Jackson http wiki fasterxml com JacksonInFiveMinutes 这让我很困惑 我的实体看起来像 Entity Table name variable public class Varia
  • 如何绕其中心旋转 PShape?

    处理手册 第二版 中有这样的示例 17 10 PShape zig void setup size 100 100 zig createShape zig beginShape zig fill 0 zig noStroke zig ver
  • 以编程方式创建 uicollectionview 时使用自定义 init 方法

    由于 Storyboard 的限制 我正在以编程方式创建 UICollectionView 这一切正常 当我想添加一个UICollectionViewCell我执行以下操作 collectionView registerClass Cell
  • 同步调用协程

    想象一下以下非常常见的情况 您编写了一个又长又复杂的函数 并意识到一些代码应该提取到一个单独的函数中以便重用和 或可读 通常 这个额外的函数调用不会改变程序的语义 但是 现在假设您的函数是一个协程 并且您要提取的代码至少包含一个异步调用 现