<p><strong>升级版:</strong></p>
<p>从Python 3.6开始,我们有了<a href="https://www.python.org/dev/peps/pep-0525/" rel="noreferrer">asynchronous generators</a>,并且能够直接在协程中使用<code>yield</code>。</p>
<pre><code>import asyncio
async def async_generator():
for i in range(3):
await asyncio.sleep(1)
yield i*i
async def main():
async for i in async_generator():
print(i)
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(main())
finally:
loop.run_until_complete(loop.shutdown_asyncgens()) # see: https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.shutdown_asyncgens
loop.close()
</code></pre>
<p><strong>Python 3.5的旧答案:</strong></p>
<p>你不能在协程中<code>yield</code>。唯一的方法是使用<code>__aiter__</code>/<code>__anext__</code>魔术方法手动实现<a href="https://www.python.org/dev/peps/pep-0492/#asynchronous-iterators-and-async-for" rel="noreferrer">Asynchronous Iterator</a>。就你而言:</p>
<pre><code>import asyncio
class async_generator:
def __init__(self, stop):
self.i = 0
self.stop = stop
async def __aiter__(self):
return self
async def __anext__(self):
i = self.i
self.i += 1
if self.i <= self.stop:
await asyncio.sleep(1)
return i * i
else:
raise StopAsyncIteration
async def main():
async for i in async_generator(3):
print(i)
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
</code></pre>
<p>输出:</p>
<pre><code>0
1
4
</code></pre>
<p>这里还有两个例子:<a href="https://stackoverflow.com/a/36094436/1113207">1</a>,<a href="https://stackoverflow.com/a/37286577/1113207">2</a></p>