Maison > Questions et réponses > le corps du texte
按照官方文档的描述,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)]
大家讲道理2017-04-18 10:09:01
Deuxième question
Pour faire simple, vous pouvez considérer l'impression de factorial comme un retour. Ensuite, le code suivant équivaut à attendre le retour de factorial. Le code ci-dessus attend le retour de asyncio.gather. collect attendra asyncio. Le résultat de la tâche appelée par Ensure_future.asyncio.ensure_future est renvoyé immédiatement.
Bien sûr, cela ne fonctionne pas dans cet exemple, mais par exemple, lorsque vous faites déjà factorial("A", 2), que devez-vous faire si vous souhaitez appeler factorial("B", 3) ? Attendre factorial( "A", 2) ? Cela équivaut en fait à un appel synchrone Donc asyncio.ensure_future peut revenir immédiatement, mais vous pouvez exécuter factorial("A", 2 sans attendre le résultat de factorial("A" , 2) )