asyncio 协程笔记

15 篇文章 0 订阅
1 篇文章 0 订阅

event loop就是一个普通的Python对象,可以通过asyncio.new_event_loop()创建无数个event loop对象。不过,loop.run_xxx()家族的函数都是阻塞的,比如run_until_complete()会等到给定的coroutine完成再结束,而run_forever()则会永远阻塞当前线程, 知道有人停止了该event loop为止。所以在同一个线程里, 两个event loop无法同时run, 但这不能阻止我们用两个线程分别跑两个event loop.

 

初始情况下,get_event_loop() 只会在主线程帮助我们创建新的event_loop, 并且在主线程中多次调用始终返回该event loop;而在其他线程中调用get_event_loop()则会报错,除非我们在这些线程中手动调用过set_event_loop()。

 

 

补充:

new_event_loop() 是创建一个event loop对象,而set_event_loop(eventloop对象)是将event loop对象指定为当前线程的event loop, 一个线程中只允许运行一个event loop, 意味着不能有两个eventloop交替运行。这两个一般搭配使用,用于给非主线程创建eventloop. 如果是主线程,则只需要get_event_loop()就可以了,也就是说,我们想运用协程,首先要生成一个loop对象,然后loop.run_xxx()就可以运行协程了,而如何创建这个loop,对于主线程是loop = get_event_loop(), 对于其他线程需要首先loop = new_event_loop(), 然后set_event_loop(loop)

 

 

asyncio.gather 将一些 Future 和 coroutine 封装成一个 Future。

 

asyncio.wait方法则返回一个 coroutine。

 

run_until_complete 既可以接收 Future 对象,也可以是 coroutine 对象,如果是coroutine,则先把他转化为future

 

ensure_future 可以将 coroutine 封装成 Task。

asyncio.ensure_future(coro_or_future, *, loop=None)

 

 task是可以理解为单个coroutine,经过ensure_future方法处理而形成,而众多task所组成的集合经过asyncio.gather处理而形成一个future。

 

再不精确的粗略的说,future就是存放着众多task或future的容器。

而task又是future的子类,所以不管是task还是future还是coreture都可以看成是一个广义的携程,future无非是一个内部包含众多携程的大携程而已,await后面,task,coroture,future都可以接。

 

example 1:

 

example 2:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值