<h2>Python3.5之前:生成器</h2>
<p>这个解决方案也适用于较新的Python版本,尽管Python3.5中的新版本<code>async def</code>似乎更适合您的用例。<em>请参见下一节</em>。你知道吗</p>
<p>生成器生成的值是通过迭代或使用<code>next</code>获得的。最后返回的值存储在<code>StopIteration</code>异常的<code>value</code>属性中,该异常指示生成器的结束。幸运的是,恢复并不太难。你知道吗</p>
<pre><code>def hardWork():
output = []
for i in range(10):
# hard work
yield 'Doing ' + str(i)
output.append(i ** 2)
return output
def generator():
# do some calculations
work = hardWork()
while True:
try:
print(next(work))
except StopIteration as e:
result = e.value
break
yield result
</code></pre>
<h2>示例</h2>
<pre><code>foo = generator()
print(next(foo))
</code></pre>
<h2>输出</h2>
<pre><code>Doing 0
Doing 1
Doing 2
Doing 3
Doing 4
Doing 5
Doing 6
Doing 7
Doing 8
Doing 9
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
</code></pre>
<h2>Python3.5+:<code>async def</code></h2>
<p>如果您运行的是Python3.5+,那么您所尝试的似乎非常适合使用等待函数的事件循环。你知道吗</p>
<pre><code>import asyncio
async def hardWork():
output = []
for i in range(10):
# do hard work
print('Doing ', i)
output.append(i**2)
# Break point to allow the event loop to do other stuff on the side
await asyncio.sleep(0)
return output
async def main():
result = await asyncio.wait_for(hardWork(), timeout=None)
print(result)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
</code></pre>
<h2>输出</h2>
<pre><code>Doing 0
Doing 1
Doing 2
Doing 3
Doing 4
Doing 5
Doing 6
Doing 7
Doing 8
Doing 9
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
</code></pre>