13. 进程、线程与协程

发布时间 2023-10-21 18:41:13作者: 星河映梦

一、线程、进程与协程

  进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是 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}")