一, 关于 多任务 概念
(单核CPU)操作系统轮流让各个任务交替执行
(多核CPU)根据CPU数量,各个任务可以做到一对于定程度的并行执行。
(1)对于操作系统来说,一个任务就是一个进程。比如打开两个记事本就启动了两个记事本进程。
(2)对于一个进程来说,可能会执行多种任务,比如word进程可能同时执行打字,拼写检查,打印等任务。
(3)这些属于进程内的任务就是线程。一个进程至少有一个线程。
(4)线程的执行和进程的执行方式是相同的。
二,Python如何实现多任务同时执行:
(1) 启动多个进程任务。
(2)启动一个进程,在一个进程内启动多个线程。
(3)启动多个进程,每个进程内包含若干个线程。
小结:
线程是最小的执行单元,而进程由至少一个线程组成。
如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间。
三, 多进程
Python作为跨平台的技术,multiprocessing模块就是跨平台版本的多进程模块。
如果要启动大量的子进程,可以用进程池的方式批量创建子进程。
(1) Unix和Linux操作系统的fork()系统调用
Unix/Linux操作系统提供了一个fork()系统调用,这个区别于普通函数的调用,会调用一次,返回两次。因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。
子进程永远返回0,而父进程返回子进程的ID。这样就实现了多进程,一个父进程fork很多子进程,记录每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID。
注意:windows没有fork调用。
有了fork调用,一个进程在接到新任务时就可以复制出一个子进程来处理新任务,常见的Apache服务器就是由父进程监听端口,每当有新的http请求时,就fork出子进程来处理新的http请求。
(2)mutiprocessing模块提供了一个Process类代表一个进程对象。
multiprocessing
模块提供了一个Process
类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束:
from multiprocessing import Process
import os
# 子进程要执行的代码