使用协程,您的代码可以重写为:
import asyncio
@asyncio.coroutine
def task(depth):
print('started depth %d' % (depth, ))
if depth > 10:
return depth
else:
# create new task
t = asyncio.async(task(depth + 1))
# wait for task to complete
yield from t
# get the result of the task
return t.result()
loop = asyncio.get_event_loop()
result = loop.run_until_complete(task(1))
print(result)
loop.close()
但是,我很难理解为什么您需要所有这些额外的代码。在您的示例代码中,您总是直接等待任务的结果,因此您的代码在没有执行程序的情况下运行没有什么不同。例如,以下将产生相同的结果
def task(depth):
print 'started depth %d' % (depth, )
if depth > 10:
return depth
else:
task(depth + 1)
我认为文档中的这个示例更好地展示了异步协程如何能够并行化任务。此示例创建 3 个任务,每个任务计算不同的阶乘。请注意,当每个任务让给另一个协程(在本例中async.sleep
)时,另一个任务是如何被允许继续执行的。
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.wait(tasks))
loop.close()
输出:
Task A: Compute factorial(2)...
Task B: Compute factorial(2)...
Task C: Compute factorial(2)...
Task A: factorial(2) = 2
Task B: Compute factorial(3)...
Task C: Compute factorial(3)...
Task B: factorial(3) = 6
Task C: Compute factorial(4)...
Task C: factorial(4) = 24