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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值