首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >与C#的ContinueWith()等效的Python是什么

与C#的ContinueWith()等效的Python是什么
EN

Stack Overflow用户
提问于 2018-06-12 03:22:56
回答 1查看 384关注 0票数 0

这段代码的Python等价物是什么?

代码语言:javascript
复制
var firstTask = new Task(() => Foo());
var secondTask = firstTask.ContinueWith((fooResult) => Bar(fooResult));
firstTask.Start();

我假设它会使用asyncio库。我知道如何在Python语言中创建任务,但我找不到一个简单的示例来实现与C#的ContinueWith()相同的功能

EN

回答 1

Stack Overflow用户

发布于 2018-06-12 03:37:32

您可以使用Future.add_done_callback() callback registration function来做同样的事情;回显对lambda函数的支持将是:

代码语言:javascript
复制
import asyncio

def continue_task_with(task, callback, *, loop=None):
    """When a task completes, schedule a new task.

    The new task is created by calling the callback with the result of
    the first task.

    """
    def done_callback(fut):
        asyncio.ensure_future(callback(fut), loop=loop)
    task.add_done_callback(done_callback)

foo_task = asyncio.ensure_future(foo())
continue_task_with(foo_task, lambda result: bar(result))
asyncio.get_event_loop().run_forever()

所以这就是:

  • Foo()
  • Registers创建了一个任务,并在任务完成时调用
  • 回调。
  • 该回调接收任务对象,并将该任务对象作为第一个参数传递给一个lambda,该lambda从该对象创建一个Bar()协程。然后,Bar().

的结果被调度为要运行的新任务。然后,

  • 调度Foo()任务;当该任务完成时,将调用Bar()回调来运行lambda

演示:

代码语言:javascript
复制
>>> async def foo():
...     print('Running foo')
...     await asyncio.sleep(1)
...     print('Completing foo')
...     return 42
...
>>> async def bar(foo_task):
...     print('Running bar')
...     if not (foo_task.cancelled() or foo_task.exception()):
...         print('Foo completed successfully, it received', foo_task.result())
...     asyncio.get_event_loop().stop()
...
>>> foo_task = asyncio.ensure_future(foo())
>>> continue_task_with(foo_task, lambda result: bar(result))
>>> asyncio.get_event_loop().run_forever()
Running foo
Completing foo
Running bar
Foo completed successfully, it received 42
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50804706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档