【问题标题】:Replace callback helper function to pass return value from coroutine into another function替换回调辅助函数以将协程的返回值传递给另一个函数
【发布时间】:2021-09-22 02:05:21
【问题描述】:
import asyncio

async def f():
    await asyncio.sleep(2.5)
    return "return value from f after 2.5 seconds"

def g(x):
    print(x)

async def main():
    ##############################################
    async def callback_helper(original, callback):
        callback(await original())
    asyncio.create_task(callback_helper(f, g))
    ##############################################
    for i in range(1, 5):
        await asyncio.sleep(1)
        print(i, "seconds in main")

asyncio.run(main())

这正是我想要的:

1 seconds in main
2 seconds in main
return value from f after 2.5 seconds
3 seconds in main
4 seconds in main

我只能修改#################### 行之间的代码。我无法更改fgmain 的其余部分。有没有更优雅的方法来做到这一点?我必须首先定义一个“回调辅助函数”,这似乎很奇怪。如何运行协程并将返回值传递给另一个函数而不阻塞?我要做的就是在完成后使用来自f 的返回值调用g。我认为asyncio 中一定有一些东西。

【问题讨论】:

    标签: python async-await python-asyncio coroutine


    【解决方案1】:

    在包装协程中等待协程的替代方法是使用add_done_callback,在所有期货上都是available,因此也是on tasks

    asyncio.create_task(f()).add_done_callback(lambda fut: g(fut.result()))
    

    【讨论】:

    • @rattlesnake 不要担心对答案的支持。我现在赞成这个问题——虽然我不认为它对其他人特别有用(基于回调的编程即将淘汰,for good reasons),但它也没有任何问题。除此之外 - 欢迎来到 StackOverflow!
    • 谢谢!也感谢您的链接。回调对我来说似乎是显而易见的解决方案。我会看看现代方法是什么。再次感谢。 :)
    • @rattlesnake 请注意,那篇文章并不完全是初学者材料——你不应该把它对 asyncio 的批评放在心上。关于回调主题的更相关的文章是同一作者的this one。它也是相当密集的阅读,但非常有趣和有影响力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 2021-04-21
    • 2021-08-14
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多