찾다

 >  Q&A  >  본문

并发 - Python中的asyncio模块中的Future和Task的区别?

问题一

按照官方文档的描述,Task是Futrue的一个subclass,标准库中也分别提供了create_task和create_future。请问这两者有功能上的什么区别?

问题二

对于ensure_future不是很理解,官方文档对于它的描述是:

asyncio.ensure_future(coro_or_future, *, loop=None)
Schedule the execution of a coroutine object: wrap it in a future. Return a Task object.If the argument is a Future, it is returned directly.

这段描述中wrap it in a future和Return a Task应该怎么理解,以下面这段代码为例子,factorial(name, number)显然是一个coroutine object,为什么wrap它到一个future对象后又返回一个Task,拜托大神解释下?

import asyncio

@asyncio.coroutine
def factorial(name, number):
    f = 1
    for i in range(2, number+1):
        print("Task %s: Compute factorial(%s)..." % (name, i))
        yield from asyncio.sleep(1)
        f *= i
    print("Task %s: factorial(%s) = %s" % (name, number, f))

loop = asyncio.get_event_loop()
tasks = [
    asyncio.ensure_future(factorial("A", 2)),
    asyncio.ensure_future(factorial("B", 3)),
    asyncio.ensure_future(factorial("C", 4))]
loop.run_until_complete(asyncio.gather(*tasks))
loop.close()

ps: 上面这段代码,如果tasks设置为下面这样,执行效果也是一样的,为什么官方文档的这个例子非要添加一个ensure_futrue,这有什么用途吗?

tasks = [
    factorial("A", 2),
    factorial("B", 3),
    factorial("C", 4)]
PHP中文网PHP中文网2767일 전570

모든 응답(1)나는 대답할 것이다

  • 大家讲道理

    大家讲道理2017-04-18 10:09:01

    두 번째 질문

    간단히 말하면 계승의 출력을 반환으로 간주할 수 있습니다. 그러면 다음 코드는 계승의 반환을 기다리는 것과 같습니다. 그리고 asyncio. 수집은 asyncio를 기다립니다. verify_future.asyncio.ensure_future에 의해 호출된 작업의 결과가 즉시 반환됩니다.

    물론 이 예에서는 작동하지 않지만, 예를 들어 이미 Factorial("A", 2)를 수행하고 있을 때, Factorial("B", 3)을 호출하려면 어떻게 해야 합니까? 계승("A", 2)을 기다리시겠습니까? 이는 실제로 동기 호출과 동일합니다. 따라서 asyncio.ensure_future는 즉시 반환될 수 있지만 계승("A"의 결과를 기다리지 않고 계승("A", 2)을 실행할 수 있습니다. , 2) )

    회신하다
    0
  • 취소회신하다