1.协程(微线程)
协程是一种用户态的轻量级线程。
协程拥有本身的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其余地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。所以:html
协程能保留上一次调用时的状态(即全部局部状态的一个特定组合),每次过程重入时,就至关于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。python
2.greenlet模块
greenlet是一个用C实现的协程模块,相比与python自带的yield,它可使你在任意函数之间随意切换,而不需把这个函数先声明为generatorlinux
例子git
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 是一个第三方库,能够轻松经过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet所有运行在主程序操做系统进程的内部,但它们被协做式地调度。github
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
4.gevent默认检测不了urllib的i/o操做缓存
5.要异步操做爬虫,必须加上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)
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 以及内存开销是很是大的。
注释:此缓存 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)