深入Asyncio(五)Event Loop
Event Loop
loop除了处理协程间的切换与结束时的异常捕捉,还要监听socket和文件描述符。先做个小测试:
>>> import asyncio
>>> loop = asyncio.get_event_loop()
>>> loop2 = asyncio.get_event_loop()
>>> loop is loop2
True # 两个loop实例是完全相同的
这意味着在一个coroutine内部获取loop,也可以通过asyncio.get_event_loop()来得到,并不需要将loop作为参数传递给协程函数。对于框架设计者来说情况又不同了,最好在函数设计中接受一个loop参数,以防止用户使用loop策略来做一些额外的事情。
注意
get_event_loop()方法仅在同样的线程中生效,如果在一个新线程中,应该用new_event_loop()来获取新的loop,并通过set_event_loop(loop)来将其设为该线程下的loop。
如果在一个coroutine函数中创建tasks而不await它们,会发生什么?事实上它们将独立于这个coroutine函数内的执行上下文来运行,这个coroutine函数将会在它启动的任务完成之前退出。
async def f():
loop = asyncio.get_event_loop()
for i in range(5):
loop.create_task(<coro>)
像上述情况,有时会在代码中看到loop变量,然后create_task()才能被调用,另一种解决方案是使用asyncio.ensure_future()方法,这个方法不需要通过loop来调用。
async def f():
for i in range(5):
asyncio.ensure_future(<coro>)
或可以通过辅助函数来做到。
def create_task(coro):
return asyncio.get_event_loop().create_task(coro)
async def f():
for i in range(5):
create_task(<coro>)
loop.create_task()和asyncio.ensure_future()对初学者来说是很微妙和困惑的,下一章讨论其中的差异。
深入Asyncio(五)Event Loop的更多相关文章
- PYTHON ASYNCIO: FUTURE, TASK AND THE EVENT LOOP
from :http://masnun.com/2015/11/20/python-asyncio-future-task-and-the-event-loop.html Event Loop On ...
- 在PYTHON3中,使用Asyncio来管理Event loop
#!/usr/bin/env python # -*- coding: utf-8 -*- import asyncio import datetime import time def functio ...
- nodejs(五)同步异步--BLOCKING THE EVENT LOOP
1.BLOCKING THE EVENT LOOP Node and JavaScript runtimes in general are single-threaded event loops. O ...
- JavaScript 运行机制详解:再谈Event Loop
原文地址:http://www.ruanyifeng.com/blog/2014/10/event-loop.html 一年前,我写了一篇<什么是 Event Loop?>,谈了我对Eve ...
- JavaScript 运行机制详解:深入理解Event Loop
Philip Roberts的演讲<Help, I'm stuck in an event-loop>,详细.完整.正确地描述JavaScript引擎的内部运行机制. 一.为什么JavaS ...
- javascript运行机制详解: 再谈Event Loop(转)
作者: 阮一峰 日期: 2014年10月 8日 一年前,我写了一篇<什么是 Event Loop?>,谈了我对Event Loop的理解. 上个月,我偶然看到了Philip Roberts ...
- Js 运行机制和Event Loop
一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. Java ...
- 浏览器与Node的事件循环(Event Loop)有何区别?
前言 本文我们将会介绍 JS 实现异步的原理,并且了解了在浏览器和 Node 中 Event Loop 其实是不相同的. 一.线程与进程 1. 概念 我们经常说 JS 是单线程执行的,指的是一个进程里 ...
- JavaScript 运行机制详解:Event Loop
参考地址:http://www.ruanyifeng.com/blog/2014/10/event-loop.html 一.为什么JavaScript是单线程? JavaScript语言的一大特点就是 ...
随机推荐
- CSS 五种方式实现 Footer 置底
CSS 五种方式实现 Footer 置底 页脚置底(Sticky footer) 就是让网页的footer部分始终在浏览器窗口的底部. 当网页内容足够长以至超出浏览器可视高度时,页脚会随着内容被推 ...
- hdu 5475(打破固定思维OR线段树)
An easy problem Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- linux运维(重点)
linux 添加系统变量: export log="log-all-$(date +%Y-%m-%d).php" export log="log-all-$(date + ...
- shell date获取时间值
使用Shell获取上一个月.星期的时间范围 #!/bin/bash date_today=`date -d '1 day ago' +%Y%m%d` #最近7天 date_befor_7day=` ...
- MySQL Workbench关键字转成小写设置
- IIS配置支持apk文件下载
写在前面 最近项目中涉及到移动端的东西,有一个功能是要下载apk文件,apk为安卓安装程序,但是iis默认是不支持该类型的文件下载的. 解决方案 找到该站点,并切换到功能视图 找到MIME类型,双击进 ...
- hdu1070(C++)
本题在于求单价,即为每一天(每200升牛奶)要多少钱,注意超过1000的当做5天,不足200的忽略 #include<iostream> #include<string> us ...
- D-Link service.cgi远程命令执行漏洞复现
1.1 概述 友讯集团(D-Link),成立于1986年,1994年10月于台湾证券交易所挂牌上市,为台湾第一家上市的网络公司,以自创D-Link品牌行销全球,产品遍及100多个国家. 1月17日,C ...
- 进程间通信(IPC)介绍(转)
进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息. IPC的方式通常有管道(包括无名管道和命名管道).消息队列.信号量.共享存储.Socket ...
- 入门--JTBC系统学习(1)
下载代码 JTBC有还例如以下几类 JDK(1.6)+JSP(2.0)+MYSQL/SQLITE ASP.NET(2.0)+ACCESS/SQL SERVER PHP+MYSQL ASP(3.0)+A ...