参考自:
知识点:
- Process
- Pool
进程间通信
进程(Process)
对于操作系统来说,一个任务就是一个进程(Process),比如打开一个word就是启动一个word进程。它不止干同一件事情,可以同时进行打字、打印等子任务操作,这些进程内的子任务就是线程(Thread)
- 单核CPU也可以执行多任务,操作系统轮流
- 让各个任务交替,Task1执行0.01秒,切换到Task2,Task2执行0.01秒,再切换到Task3,执行0.01秒……..这样反复执行下去
- 真正的并行执行多任务只能在多核CPU上实现
多进程(Multiprocessing)
Multiprocessing模块提供了一个Process类来代表一个进程对象,下面代码演示了创建一个子进程,并等待其结束
- os.getpid() 获取父进程的ID
- 创建子进程时,首先创建Process类的实例,再传入一个函数和它的参数
- 用start()来启动子进程
- jion() 等待子进程结束后再继续运行下去,用于进程之间的同步
|
|
执行结果如下:
|
|
Pool
如果要启动大量的子进程,可以使用进程池(Pool)。
|
|
执行结果如下:
|
|
Pool对象需要调用join()方法会等待所有subprocess执行完毕,调用join()方法之前必须要先调用close()方法,调用close()方法后就不能再添加新的subprocess了
我们看到输出是task0, 1, 2, 3执行了,而task4需要等待某个task执行完毕才能运行,这是因为我们设置了进程池大小为4,它只能同时执行4个子进程,如果不设置进程池大小,就是默认电脑的CPU最大核数
之前用Multiprocess写过多进程爬虫,抓取速度极快,数据量小的甚至可以做到秒抓
进程间通信
Process之间都需要通信,Multiprocessing提供了Queue(队列)Pipe(管道)来进行数据的交换
这里是Queue(队列)为例子,创建两个子进程,一个写数据,一个读数据。创建Queue的实例q,父进程创建队列,分别传递给write和read两个子进程
|
|
执行结果如下:
|
|
董伟明老师写的多进程教程明显难度要高于廖老师的,用了很多Python的语法糖,需要额外去理解闭包、装饰器、递归,但廖老师的更容易理解