python 3.x 学习笔记壹柒(协程以及I/O方式)

1.协程(微线程)
协程是一种用户态的轻量级线程。
协程拥有和谐的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到别的地方,在切回到的时候,恢复生机原先保存的寄存器上下文和栈。因而:

协程能保留上一次调用时的动静(即全数片段情形的二个一定组合),每回经过重入时,就相当于进入上1回调用的图景,换种说法:进入上3遍离开时所处逻辑流的职位。

2.greenlet模块
greenlet是一个用C完毕的协程模块,相比较与python自带的yield,它能够使您在任意函数之间自由切换,而不需把那个函数先评释为generator

例子

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()

 

3.gevent模块
gevent
是三个第3方库,能够轻松通过gevent完成产出同步或异步编制程序,在gevent中用到的第二格局是格林let,
它是以C扩充模块情势接入Python的轻量级协程。
格林let全体运维在主程序操作系统进度的中间,但它们被同盟式地调度。

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),
])

结果

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

 

肆.gevent默许检查评定不了urllib的i/o操作

 

伍.要异步操作爬虫,必须抬高monkey.patch_all(),意思是把最近先后的持有的io操作单独做上标记

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)

 

陆.事件驱动模型
日前多数的UI编制程序都以事件驱动模型,如很多UI平台都会提供onClick()事件,那么些事件就象征鼠标按下事件。事件驱动模型大体思路如下:
  一). 有二个事变(音讯)队列;
  二. 鼠标按下时,往那么些行列中加进二个点击事件(音讯);
  叁).
有个巡回,不断从队列取出事件,遵照分歧的轩然大波,调用不相同的函数,如onClick()、onKeyDown()等;
  肆).
事件(音信)壹般都各自小编保护存各自的处理函数指针,那样,各种消息都有单独的处理函数;

柒.事件驱动编制程序是1种编制程序范式,这里先后的推行流由外部事件来控制。它的个性是含有一个轩然大波循环,当外部事件产生时利用回调机制来触发相应的拍卖。其余三种常见的编制程序范式是(单线程)同步以及二10102线程编制程序。

8.缓存 I/O 

  缓存 I/O 又被称作标准 I/O,大部分文件系统的暗中认可 I/O 操作都是缓存
I/O。在 Linux 的缓存 I/O 机制中,操作系统会将 I/O
的数据缓存在文件系统的页缓存( page cache
)中,约等于说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。

缓存 I/O 的缺点
  数据在传输进程中须求在应用程序地址空间和基本举行多次数额拷贝操作,那一个多少拷贝操作所带来的
CPU 以及内部存款和储蓄器开支是非凡大的。

注释:此缓存 I/O 在linux环境下的I/O
详解:http://www.cnblogs.com/alex3714/articles/5876749.html

9.IO模式

阻塞 I/O(blocking IO)
非阻塞 I/O(nonblocking IO)
I/O 多路复用( IO multiplexing)
实信号驱动 I/O( signal driven IO)
异步 I/O(asynchronous IO)

相关文章