<p>使用协同程序,您的代码可以重写为:</p>
<pre><code>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()
</code></pre>
<p>但是,我很难理解为什么需要这些额外的代码。在示例代码中,您总是直接等待任务的结果,因此如果没有执行器,您的代码将不会有任何不同的运行。例如,下面将产生相同的结果</p>
^{pr2}$
<p>我认为文档中的这个例子更好地展示了异步协程如何能够并行化任务。这个例子创建了3个任务,每个任务都计算不同的阶乘。请注意,当每个任务产生另一个协程(在本例中是<code>async.sleep</code>)时,如何允许另一个任务继续执行。在</p>
<pre><code>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()
</code></pre>
<p>输出:</p>
<pre><code>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
</code></pre>