按照官方文档的描述,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)]
Soalan kedua
Ringkasnya, anda boleh menganggap cetakan faktorial sebagai pulangan Kemudian, kod berikut adalah bersamaan dengan menunggu pengembalian faktorial Kod di atas sedang menunggu pengembalian asyncio.gather. gather akan menunggu asyncio Hasil tugasan yang dipanggil oleh ensure_future.asyncio.ensure_future dikembalikan serta-merta.
Sudah tentu ia tidak berfungsi dalam contoh ini, tetapi sebagai contoh, apabila anda sudah melakukan faktorial("A", 2), apakah yang perlu anda lakukan jika anda mahu memanggil faktorial("B", 3)? Tunggu faktorial( "A", 2)? Itu sebenarnya bersamaan dengan panggilan segerak Jadi asyncio.ensure_future boleh kembali serta-merta, tetapi anda boleh menjalankan faktorial("A", 2 tanpa menunggu keputusan faktorial("A". , 2) )