深入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语言的一大特点就是 ...
随机推荐
- MEF 注入[转载]
领域服务的时候,用到MEF的注入有参构造函数的方法,your master was attracted,打算稍微深挖一下,这篇来对此知识点做个总结. 一.知识点回顾 MEF作为IOC的方式之一,它的主 ...
- Linux和Windows兼容
1. 介绍 我们知道Linux上的应用程序是ELF格式的,而Windows则是PE格式 所以要解决这个问题首先二进制加载问题:其次,就是API问题,两者的API完全不同要实现兼容,就需要构建一个虚拟层 ...
- android中与Adapter相关的控件----ViewFlipper
ViewFlipper(翻转视图) 一.ViewFlipper是一个多页面管理的控件,与ViewPager不同,ViewPager的是一页一页的的,而ViewFlipper则是一层一层的.图片轮播或者 ...
- hdu 4857(好题,反向拓扑排序)
逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- Action 和 Func 的用法以及区别
Action 无返回值 Func 有返回值,且最后一个参数为返回值 Action用法 public static void test(string s) { Console.WriteLine(&qu ...
- 使用UICollectionView遇到的各种坑
1)头视图和尾部视图的添加 UICollectionReusableView *headerView = [collectionView dequeueReusableSupplementaryVie ...
- Codeforces Gym100971 F.Two Points (IX Samara Regional Intercollegiate Programming Contest Russia, Samara, March 13)
这个题直接推公式就可以. 就是解一元二次方程,用高中学的公式,函数开口向上,求最大值为(4ac-b*b)/4a. 这个题推出来一元二次方程,然后将最大值的公式化简一下.公式很好推. 这个题有疑问,in ...
- SecureCRT使用Ctrl+D快速关闭Tab
- 基于WPF系统框架设计(5)-Ribbon整合Avalondock 2.0实现多文档界面设计(二)
AvalonDock 是一个.NET库,用于在停靠模式布局(docking)中排列一系列WPF/WinForm控件.最新发布的版本原生支持MVVM框架.Aero Snap特效并具有更好的性能. Ava ...
- datasnap——动态注册服务类
datasnap——动态注册服务类 在DataSnap的应用程序时,我们首先需要注册的服务器类,以提供访问客户端应用程序的服务器方法.通常的做法是使用DSServerClass组件,但有些时候,我们要 ...