python loop call soon_python3-asyncio 学习笔记 1 -- call_soon
最近在学习python3 的 asyncio, 特将学习笔记记录于此.
先来个简单的例子:
import asyncio
def hello_world(loop):
print('Hello World')
loop.stop()
loop = asyncio.get_event_loop()
# Schedule a call to hello_world()
loop.call_soon(hello_world, loop)
# Blocking call interrupted by loop.stop()
loop.run_forever()
loop.close()
可以看到先是通过
asyncio.get_event_loop()
得到事件循环,而这是 selector_events.BaseSelectorEventLoop 、base_events.BaseEventLoop 的一个实例.。之后调用 call_soon以达到立即执行的目的,这个 call_soon来自base_events.BaseEventLoop ,实际的是抛给了 events.Handle,生成了一个 Handle的实例,实际执行是 Handle._run, 但是在实例 Handle后并没有立即调用_run,而是将生成的 Handle 实例添加到了 base_events.BaseEventLoop. _ready 中,直到调用
loop.run_forever()
才开始执行, 那么这个 loop.run_forever() 做了啥?
def run_forever(self):
"""Run until stop() is called."""
self._check_closed()
if self.is_running():
raise RuntimeError('This event loop is already running')
if events._get_running_loop() is not None:
raise RuntimeError(
'Cannot run the event loop while another loop is running')
self._set_coroutine_wrapper(self._debug)
self._thread_id = threading.get_ident()
if self._asyncgens is not None:
old_agen_hooks = sys.get_asyncgen_hooks()
sys.set_asyncgen_hooks(firstiter=self._asyncgen_firstiter_hook,
finalizer=self._asyncgen_finalizer_hook)
try:
events._set_running_loop(self)
while True:
self._run_once()
if self._stopping:
break
finally:
self._stopping = False
self._thread_id = None
events._set_running_loop(None)
self._set_coroutine_wrapper(False)
if self._asyncgens is not None:
sys.set_asyncgen_hooks(*old_agen_hooks)
loop.run_forever() 先是检查是否有正在运行的事件循环, 保证同一时间只有一个loop运行,之后
try:
events._set_running_loop(self)
while True:
self._run_once()
if self._stopping:
break
可以看到是一直调用_run_once(),由于 _run_once()内容较多这里就不再贴完整的代码, 只摘抄关键的部分.
ntodo = len(self._ready)
for i in range(ntodo):
handle = self._ready.popleft()
if handle._cancelled:
continue
if self._debug:
pass # not care ...
else:
handle._run()
handle = None # Needed to break cycles when an exception occurs.
可以看出, 所有的call_soon遵循FIFO原则,不过这里还是会block的, 比如在前文中的hello_world中加入耗时的操作. 所以一旦想用异步,还是全部使用异步,要么0要么1.
python loop call soon_python3-asyncio 学习笔记 1 -- call_soon相关推荐
- Python基础教程-菜鸟教程学习笔记1
Python基础教程-菜鸟教程学习笔记1 文章目录 Python基础教程-菜鸟教程学习笔记1 前言 Python 简介 1. 第一个Python程序 2. Python 中文编码 3. 基本语法 1) ...
- Python预测 数据分析与算法 学习笔记(特征工程、时间序列)
微信公众号:数学建模与人工智能 GitHub - QInzhengk/Math-Model-and-Machine-Learning 第3章 探索规律 3.1 相关分析 相关关系是一种与函数关系相区别 ...
- Python可视化物理随机过程---pygame学习笔记2
Python可视化物理随机过程-pygame学习笔记2 文章目录 Python可视化物理随机过程---pygame学习笔记2 一.扩散现象的简单的介绍 二.代码实现 三.运行代码的效果展示 四.总结 ...
- python查看方法作用_python学习笔记1,新手小白也能看得懂
这是酸菜在风变编程上学习python时积累的学习笔记,希望能帮到同样也在学习中的小伙伴.持续更新~ 第0关 Print()函数 (1)不带引号:让计算机读懂括号里的内容,打印最终的结果 例:print ...
- python 面向对象(类)--学习笔记
面向对象是一种编程方式, 主要集中在类和对象的两个概念 python 中的类符合封装, 继承, 多态的特征 类 是一个模板, 是n多函数的集成 对象 是类的实例化 类的成员分为三大类:字段.方法.属性 ...
- python 坐标轴 单位刻度_Python学习笔记(matplotlib篇)--坐标轴刻度
python学习笔记--坐标轴刻度 所用的库及环境: ide:pycharm python环境:python3.7 matplotlib: matplotlib 1.11 numpy: nump ...
- python矩阵左除_matlab学习笔记
Matlab学习笔记 运算: 1. 算术运算(在矩阵意义下进行) +:要求矩阵同型,对应元素相加减,如果用标量和矩阵相加减,不同型就凉凉提示错误,那就将矩阵每个元素和数字相加减 -:同上 *: ...
- python的基本数据结构_Python学习笔记——基本数据结构
列表list List是python的一个内置动态数组对象,它的基本使用方式如下: shoplist = ['apple', 'mango', 'carrot', 'banana'] print 'I ...
- python的基本数据结构_python学习笔记-基本数据结构
Python 学习笔记-1 写在最前面,因为组内小伙伴要走,生信团队由原来的7个人,慢慢的变的只有我一个人了,需要紧急突击下python,因为有python的流程要交接维护 python 基本情况 代 ...
最新文章
- 用ldap方式访问AD域的的错误解释
- ERROR MESSAGE: Invalid command line: Malformed walker argument: Could not find walker with name
- 产品管理|产品设计流程[完整版]
- linux启动exe出来SQLite问题,CentOS 7下sqlite3的问题修复
- future java 多线程_Java多线程之Future与FutureTask
- tushare查看a股是否跌到位
- 11.13 模10计数器设计
- [转载] 【Java】将一个字符串的字符排序,按ASCII表的顺序从小到大
- 理论基础 —— 树 —— 树的存储结构
- [Contest]2017 ACM/ICPC Asia Regional Shenyang Online(01 03 07 09 10 11待补)
- webpack常用知识点
- python3 def download_python3下载抖音视频
- ios无痕埋点_掌握数据生命周期:初识数据埋点
- 多线程之同步synchronized的使用不当造成java.lang.IllegalMonitorStateException 异常
- python播放wav音频文件源码
- 黑客入侵电脑网络四大步骤全面曝光
- 25个最好免费下载电子书(Ebooks)的网站
- vs离线安装Qt开发插件vsix
- PMP备考之路 - 汪博士第六章(项目进度管理)
- 华北电力保定校区学计算机好吗,华北电力大学保定校区计算机专业
热门文章
- 数据挖掘的一个完整过程
- abb变频器如何就地增加频率_abb变频器报接地故障如何处理,故障原因分析
- c++ 取机器码_吉林c系列防倒灌风帽怎么卖,流线型通风器可定制
- python怎样入门_python怎么入门啊?
- vuecli 实战商城后台管理系统_前台商城系统及后台管理系统
- ngTemplateOutlet递归的问题
- C#程序中设置全局代理(Global Proxy)
- Mysql实现企业级日志管理、备份与恢复
- [翻译] FastReport Class Hierarchy (FastReport 组件类层次结构)
- sublime text 自动保存