概念介绍
首先简单介绍几个概念:
- 进程和线程
- 进程就是一个程序在一个数据集上的一次动态执行过程(数据集是程序在执行过程中所需要使用的资源)。
- 线程也叫轻量级进程,它是一个基本的 CPU 执行单元,是比进程更小的能独立运行的基本单位。
- 进程和线程的关系:
- 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
- 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
- CPU 分给线程,即真正在 CPU 上运行的是线程。
- 并行和并发
- 并行处理是计算机系统中能同时执行两个或更多个处理的一种计算方法。并行处理可同时工作于同一程序的不同方面,其主要目的是节省大型和复杂问题的解决时间。
- 并发处理指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个 CPU 上运行,但任一个时刻点上只有一个程序在 CPU 上运行。
- 并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。所以说,并行是并发的子集。多进程是并行的,多线程是并发的。
- 同步和异步
- 同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去。
- 异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。
- 举个例子,打电话时就是同步通信,发短息时就是异步通信。
测试环境
进行对比测试之前,我们先来创建一个合适的实验环境:
模拟一个需要等待一定时间才可以获取返回结果的网页。
如果直接用百度、CSDN 等站点的话,一方面响应太快、难以看出各种方法的差距,另一方面响应速度会受网速影响、每次发送请求获取响应所需的时间不完全一致导致重复实验结果差距较大,所以在此用 Flask 模拟一个本地慢速服务器。
flask_server.py
代码如下:
from flask import Flask # pip install flask
import time
app = Flask(__name__)
@app.route('/')
def index():
time.sleep(3) # 休眠 3 秒再返回结果
return 'Hello!'
if __name__ == '__main__':
app.run(threaded=True) # 以多线程模式启动服务
启动之后,Flask 服务默认在 127.0.0.1:5000
上运行,控制台输出结果如下:
* Serving Flask app "flask_server" (lazy loading)
* Environment: production
WARNING: Do not use the development server