最近在学习python的协程,将自己在学习过程中遇到的比较好的资料记录下来,希望能帮到更多人
生成器、迭代器、可迭代对象:
https://nvie.com/posts/iterators-vs-generators/
asyncio:
- 英文:https://www.educative.io/blog/python-concurrency-making-sense-of-asyncio
- 英文:https://realpython.com/async-io-python/
- 中文:https://zhuanlan.zhihu.com/p/72887901
- 中文:https://www.pythonf.cn/read/99110
asyncio.Queue在生产者-消费者模型中的示例代码
import asyncio, random
async def rnd_sleep(t):
# sleep for T seconds on average
await asyncio.sleep(t * random.random() * 2)
async def producer(queue):
while True:
token = random.random()
print(f'produced {token}')
if token < .05:
break
await queue.put(token)
await rnd_sleep(.1)
async def consumer(queue):
while True:
token = await queue.get()
await rnd_sleep(.3
queue.task_done()
print(f'consumed {token}')
async def main():
queue = asyncio.Queue()
# fire up the both producers and consumers
producers = [asyncio.create_task(producer(queue))
for _ in range(3)]
consumers = [asyncio.create_task(consumer(queue))
for _ in range(10)]
# with both producers and consumers running, wait for
# the producers to finish
await asyncio.gather(*producers)
print('---- done producing')
# wait for the remaining tasks to be processed
await queue.join()
# cancel the consumers, which are now idle
for c in consumers:
c.cancel()
asyncio.run(main())
https://stackoverflow.com/a/52615705
future示例代码:
import asyncio
from asyncio import Future
async def bar(future):
print("bar will sleep for 3 seconds")
await asyncio.sleep(3)
print("bar resolving the future")
future.done()
future.set_result("future is resolved")
async def foo(future):
print("foo will await the future")
await future
print("foo finds the future resolved")
async def main():
future = Future()
results = await asyncio.gather(foo(future), bar(future))
if __name__ == "__main__":
asyncio.run(main())
print("main exiting")
python中的协程实现方式随着python版本的变化而变化
比如在python3.5之前,协程的实现通过基于生成器的协程
@asyncio.coroutine
def do_something_important():
yield from asyncio.sleep(1)
而在python3.5,则通过async/await原生实现协程
async def coro():
await asyncio.sleep(1)
python3.7以前这样运行事件循环
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
python3.7变为
asyncio.run(main())