一、线程、进程与协程
进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是 CPU 调度和分派的基本单位。线程是比进程更小的能独立运行的基本单位,线程基本上不拥有系统资源,只拥有一点在运行过程中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其它线程共享进程所拥有的全部资源。
在实现多任务时,线程切换从系统层面远不止保存和恢复 CPU 上下文这么简单。操作系统为了程序运行的高效性,每个线程都有自己缓存 Cache 等数据。操作系统还会帮你做这些数据的恢复操作。所以线程的切换比较耗性能。但是协程的切换只是单纯的操作 CPU 的上下文。
一个程序至少有一个进程,一个进程至少有一个线程;
线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高;
进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率;
二、多进程的使用场景
多进程 适合 计算密集型 的场景。
【1】、多进程的使用
import os, time
from multiprocessing import Process
def task():
val = 1
for i in range(1, 100000):
val *= i
if __name__ == "__main__":
l = []
count = int(os.cpu_count())
print(f"当前计算机CPU核心个数:{count}")
start_time = time.time()
for i in range(count):
p = Process(target=task)
p.start()
l.append(p)
for p in l:
p.join()
print(f"运行时间:{time.time() - start_time}")
【2】、多线程的使用
import os, time
from threading import Thread
def task():
val = 1
for i in range(1, 100000):
val *= i
if __name__ == "__main__":
l = []
count = int(os.cpu_count())
print(f"当前计算机CPU核心个数:{count}")
start_time = time.time()
for i in range(count):
t = Thread(target=task)
t.start()
l.append(t)
for t in l:
t.join()
print(f"运行时间:{time.time() - start_time}")
二、多线程的使用场景
多线程 适合 IO 密集型 场景
【1】、多进程的使用
import time
from multiprocessing import Process
def task():
time.sleep(3)
if __name__ == "__main__":
l = []
start_time = time.time()
for i in range(1000):
p = Process(target=task)
p.start()
l.append(p)
for p in l:
p.join()
print(f"运行时间:{time.time() - start_time}")
【2】、多线程的使用
import time
from threading import Thread
def task():
time.sleep(3)
if __name__ == "__main__":
l = []
start_time = time.time()
for i in range(1000):
t = Thread(target=task)
t.start()
l.append(t)
for t in l:
t.join()
print(f"运行时间:{time.time() - start_time}")