python协程调度方式_python 3.x 学习笔记17(协程以及I/O模式)
1.协程(微线程)
协程是一种用户态的轻量级线程。
协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此:
协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。
2.greenlet模块
greenlet是一个用C实现的协程模块,相比与python自带的yield,它可以使你在任意函数之间随意切换,而不需把这个函数先声明为generator
例子
from greenlet importgreenletdeffun1():print(6)
gar2.switch()#转换到gar2
print(58)deffun2():print(54)
gar1.switch()
gar1= greenlet(fun1) #启动协程
gar2 =greenlet(fun2)
gar1.switch()
3.gevent模块
gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。
importgeventdeffun1():print('第一次运行fun1')
gevent.sleep(2) #切换到fun2的gevent.sleep(1)这一步print('第二次运行fun1')deffun2():print('第一次运行fun2')
gevent.sleep(1) #sleep时间没到继续切换到fun3的gevent.sleep(2)print('第二次运行fun2')deffun3():print('第一次运行fun3')
gevent.sleep(2)print('第二次运行fun3')
gevent.joinall( [
gevent.spawn(fun1),
gevent.spawn(fun2),
gevent.spawn(fun3),
])
结果
第一次运行fun1
第一次运行fun2
第一次运行fun3
第二次运行fun2
第二次运行fun1
第二次运行fun3
4.gevent默认检测不了urllib的i/o操作
5.要异步操作爬虫,必须加上monkey.patch_all(),意思是把当前程序的所有的io操作单独做上标记
如
from urllib importrequestimportgevent,timefrom gevent importmonkey
monkey.patch_all()#把当前程序的所有的io操作单独做上标记
deff(url):print('GET%s'%url)
resp=request.urlopen(url)
data=resp.read()print('%d 数据接收来自%s.' %(len(data), url))
start_time=time.time()
gevent.joinall([
gevent.spawn(f,'https://www.python.org/'),
gevent.spawn(f,'https://www.baidu.com/'),
gevent.spawn(f,'https://github.com/'),
])print('总共时间:',time.time()-start_time)
6.事件驱动模型
目前大部分的UI编程都是事件驱动模型,如很多UI平台都会提供onClick()事件,这个事件就代表鼠标按下事件。事件驱动模型大体思路如下:
1). 有一个事件(消息)队列;
2. 鼠标按下时,往这个队列中增加一个点击事件(消息);
3). 有个循环,不断从队列取出事件,根据不同的事件,调用不同的函数,如onClick()、onKeyDown()等;
4). 事件(消息)一般都各自保存各自的处理函数指针,这样,每个消息都有独立的处理函数;
7.事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。另外两种常见的编程范式是(单线程)同步以及多线程编程。
8.缓存 I/O
缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。在 Linux 的缓存 I/O 机制中,操作系统会将 I/O 的数据缓存在文件系统的页缓存( page cache )中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。
缓存 I/O 的缺点:
数据在传输过程中需要在应用程序地址空间和内核进行多次数据拷贝操作,这些数据拷贝操作所带来的 CPU 以及内存开销是非常大的。
9.IO模式
阻塞 I/O(blocking IO)
非阻塞 I/O(nonblocking IO)
I/O 多路复用( IO multiplexing)
信号驱动 I/O( signal driven IO)
异步 I/O(asynchronous IO)
python协程调度方式_python 3.x 学习笔记17(协程以及I/O模式)相关推荐
- python测试自动化封装_python接口自动化学习笔记(封装获取测试数据方法)
本篇文章是接于python接口自动化学习笔记(封装方法用于读取excel) 后的拓展,讲解在封装完成excel的数据读取代码后,如何在data层进行使用 首先,我准备了这样一个excel表格用以存储测 ...
- 对python的评价语_Python自然语言处理学习笔记之评价(evaluationd)
对模型的评价是在test set上进行的,本文首先介绍测试集应该满足的特征,然后介绍四种评价方法. 一.测试集的选择 1.首先,测试集必须是严格独立于训练集的,否则评价结果一定很高,但是虚高,不适用于 ...
- python locust提取参数_python+locust性能测试学习笔记
前言 Locust(俗称 蝗虫)一个轻量级的开源压测工具,基本功能是用Python代码描述所有测试.不需要笨拙的UI或庞大的XML,只需简单的代码即可. 环境安装 Locust支持Python 2.7 ...
- python quit函数作用_Python常用函数学习笔记
Python函数很多,常用的函数不同的场景侧重不同,学而时习之,不亦乐乎? abs # 求绝对值 Capitilize函数: # 有列表 li = ['aB', 'egon', 'smith', 'p ...
- python网络编程库_python网络编程学习笔记(9):数据库客户端
一.DB-API概述 python支持很多不同的数据库.由于不同的卖家服务器导致和数据库通信的网络协议各有不同.在python的早期版本中,每一种数据库都带有自己的python模块,所有这些模块以不同 ...
- python自然语言处理评论_python自然语言处理——学习笔记:Chapter3纠错
2017-12-06更新:很多代码执行结果与书中不一致,是因为python的版本不一致.如果发现有问题,可以参考英文版: 第三章,P87有一段处理html的代码: >>>raw =n ...
- python元组怎么使用_Python 2.7 学习笔记 元组的使用
一.元组 python中的元组和列表非常类似,核心区别是元组的内容初始化后是不可以修改的,而队列可以. 关于列表的详细介绍,可查看上一篇列表使用文章. 大部分场景下,能用元组的地方,都可以用列表.但有 ...
- python modbus tk 库_python modbus_tk模块学习笔记(rtu slaver例程)
GIT地址:https://github.com/ljean/modbus-tk 找到modbus rtu slaver 例程 用宝塔将例程复制到centos目录 #!/usr/bin/env pyt ...
- python虚拟环境的安装_Python虚拟环境搭建学习笔记
1. Python虚拟环境 满足不同版本的需要所以来创建虚拟环境 2. 下载安装 * 清华的镜像 [https://mirror.tuna.tsinghua.edu.cn/help/anaconda/ ...
- python的head函数_Python(Head First)学习笔记:五
5 推导数据:处理数据.格式.编码.解码.排序 处理数据:从Head First Python 上下载资源文件,即:james.txt,julie.txt,mikey.txt,sarah.txt. 实 ...
最新文章
- 「打造中国人自己的开放 AI」:清华教授唐杰宣布成立AI新期刊
- Linux基础:调查和管理进程
- 浅谈Linux的内存管理机制
- 技术有时间衰减因子.
- 使用object detection训练并识别自己的模型
- 什么是JVM内存模型
- 中文版php.ini
- 经典面试题(52):以下代码将输出的结果是什么?
- git规则写法_3条简单的规则将帮助您成为Git大师
- 深度学习-为什么用激活函数
- win7 / mysql-8.0.11-winx64 安装的测坑步骤
- 实现MINST图片的分类程序
- 2023年厦门大学全日制会计专硕(MPAcc)考研上岸前辈备考经验
- 云班课蓝墨云网页版资源如何下载
- 大数据时代数据资产管理“五星模型”:三个基础两个飞轮
- win7系统如何映射服务器,win7系统如何映射网络驱动器 win7系统映射网络驱动器方法...
- **遇到“Cannot create file “不要慌**
- 医学图像分割之Attention U-Net
- Java中用Apache POI生成excel和word文档
- 计算机一级扫描件,学院年终科研成果统计提交成果扫描件要求