学习笔记17

7.事件驱动编程是风华正茂种编程范式,这里前后相继的执行流由外部事件来决定。它的特征是带有三个事变循环,当外界事件产生时利用回调机制来触发相应的管理。别的二种何奇之有的编制程序范式是(单线程卡塔尔同步以致四十多线程编制程序。

结果

import gevent

def fun1():
    print('第一次运行fun1')
    gevent.sleep(2)           #切换到fun2的gevent.sleep(1)这一步
    print('第二次运行fun1')
def fun2():
    print('第一次运行fun2')
    gevent.sleep(1)            #sleep时间没到继续切换到fun3的gevent.sleep(2)
    print('第二次运行fun2')
def fun3():
    print('第一次运行fun3')
    gevent.sleep(2)
    print('第二次运行fun3')

gevent.joinall( [
    gevent.spawn(fun1),
    gevent.spawn(fun2),
    gevent.spawn(fun3),
])

例子

 

缓存 I/O 的澳门新葡亰平台官网 ,缺点
  数据在传输进程中必要在应用程序地址空间和水源进行频仍多少拷贝操作,那几个多少拷贝操作所带给的
CPU 以至内部存款和储蓄器开支是不行大的。

 

5.要异步操作爬虫,必需抬高monkey.patch_all(),意思是把当前前后相继的保有的io操作单独做上标志

from greenlet import greenlet

def fun1():
    print(6)
    gar2.switch() #转换到gar2
    print(58)

def fun2():
    print(54)
    gar1.switch()


gar1 = greenlet(fun1) #启动协程
gar2 = greenlet(fun2)
gar1.switch()

6.事件驱动模型
日前大多数的UI编制程序都以事件驱动模型,如超级多UI平台都会提供onClick()事件,那几个事件就象征鼠标按下事件。事件驱动模型大意思路如下:
  1卡塔尔国. 有三个事变(消息卡塔尔队列;
  2. 鼠标按下时,往那几个行列中扩大叁个点击事件(音讯卡塔尔国;
  3卡塔 尔(英语:State of Qatar).
有个巡回,不断从队列抽出事件,依照差别的事件,调用区别的函数,如onClick()、onKeyDown()等;
  4卡塔尔.
事件(新闻卡塔 尔(英语:State of Qatar)经常都分别保存各自的管理函数指针,那样,每一个新闻都有独立的管理函数;

4.gevent暗中同意质量评定不了urllib的i/o操作

  缓存 I/O 又被称作标准 I/O,大好多文件系统的默许 I/O 操作都以缓存
I/O。在 Linux 的缓存 I/O 机制中,操作系统会将 I/O
的多寡缓存在文件系统的页缓存( page cache
卡塔 尔(英语:State of Qatar)中,也正是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地点空间。

注释:此缓存 I/O 在linux碰到下的I/O
详解:

 

第一次运行fun1
第一次运行fun2
第一次运行fun3
第二次运行fun2
第二次运行fun1
第二次运行fun3

阻塞 I/O(blocking IO)
非阻塞 I/O(nonblocking IO)
I/O 多路复用( IO multiplexing卡塔 尔(英语:State of Qatar)
时限信号驱动 I/O( signal driven IO卡塔尔国
异步 I/O(asynchronous IO)

9.IO模式

1.协程(微线程)
协程是意气风发种客户态的轻量级线程。
协程具有自个儿的贮存器上下文和栈。协程调整切换时,将贮存器上下文和栈保存到任哪个地方方,在切回到的时候,苏醒原先保存的寄放器上下文和栈。由此:

协程能保存上一次调用时的情形(即具备片段景况的二个特定组合卡塔 尔(阿拉伯语:قطر‎,每便经过重入时,就一定于踏向上叁遍调用的情景,换种说法:步向上一回离开时所处逻辑流之处。

2.greenlet模块
greenlet是二个用C达成的协程模块,相比较与python自带的yield,它能够使您在自便函数之间自由切换,而不需把这么些函数先声明为generator

from urllib import request
import gevent,time
from gevent import monkey
monkey.patch_all() #把当前程序的所有的io操作单独做上标记
def f(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)

 

3.gevent模块
gevent
是一个第三方库,能够轻易通过gevent达成产出同步或异步编制程序,在gevent中用到的机要方式是Greenlet,
它是以C扩充模块方式接入Python的轻量级协程。
Greenlet全体运转在主程序操作系统进度的里边,但它们被合营式地调节。

8.缓存 I/O 

发表评论

电子邮件地址不会被公开。 必填项已用*标注