python协程学习路径

最近在学习python的协程,将自己在学习过程中遇到的比较好的资料记录下来,希望能帮到更多人

生成器、迭代器、可迭代对象
https://nvie.com/posts/iterators-vs-generators/

asyncio:

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())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值