首页 » Python » Python 从入门到放弃 - Lesson 10 多进程、协程、异步IO

Python 从入门到放弃 - Lesson 10 多进程、协程、异步IO

 
文章目录

多进程

multiprocessing模块

与threading模块用法相似,用于创建多进程

进程间通信

Queue

用于进程间传递数据的队列,与线程队列用法类似,通过put()和get()来存取队列

Pipe

Pipe对象是一个可以实现进程间通信的管道,包含两个收发节点,通过send()和recv()进行发送和接收,类似于socket

Manager

Manager对象可以管理支持进程间共享的各种数据类型,包括: 列表, 字典, 变量, 锁, 递归锁, 信号量, 事件, 队列等等(list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array.)

进程锁

不同进程对标准输出的占用可能引起混乱,通过锁机制避免同时输出

进程池

限制同时运行的进程数

协程

协程是一种用户态的轻量级线程

yield协程

greenlet协程

greenlet是一个用C实现的协程模块,相比与python自带的yield,它可以使你在任意函数之间随意切换,而不需把这个函数先声明为generator

gevent

Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。

gevent自动IO切换

利用gevent实现并发下载

gevent版socket

事件驱动与异步IO

事件驱动模型

目前大部分的UI编程都是事件驱动模型,如很多UI平台都会提供onClick()事件,这个事件就代表鼠标按下事件。事件驱动模型大体思路如下:

1. 有一个事件(消息)队列;
2. 鼠标按下时,往这个队列中增加一个点击事件(消息);
3. 有个循环,不断从队列取出事件,根据不同的事件,调用不同的函数,如onClick()、onKeyDown()等;
4. 事件(消息)一般都各自保存各自的处理函数指针,这样,每个消息都有独立的处理函数。

异步IO和IO多路复用

常用的IO类型:

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

Select\Poll\Epoll(IO多路复用)的基本原理就是select,poll,epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。

asynchronous IO(异步IO):用户进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。

Comparison_of_the_file_IO_models

IO多路复用实例:select socket

IO多路复用实例:selectors socket

原文链接:Python 从入门到放弃 - Lesson 10 多进程、协程、异步IO,转载请注明来源!

0