并发 - Python中的asyncio模块中的Future和Task的区别?
PHP中文网
PHP中文网 2017-04-18 10:07:01
0
1
526

问题一

按照官方文档的描述,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中文网

认证0级讲师

全部回复 (1)
大家讲道理

第二个问题

简单来说你可以将factorial的print看成一个return.那么,下面的代码就等于在等待factorial的返回.而上面的代码在等待asyncio.gather的返回.而asyncio.gather会等待asyncio.ensure_future调用的任务的结果.asyncio.ensure_future是立即返回的.

在这个例子中当然看不出作用,但是,比如,你已经在进行了factorial("A", 2)的时候,你想调用factorial("B", 3)怎么办,等待factorial("A", 2)的结束吗?那实际上等于同步调用了.所以asyncio.ensure_future可以立即返回,然你不必等待factorial("A", 2)的结果即可运行factorial("A", 2)

    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责声明 Sitemap
    PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!