并发 Vs 并行
1. 概念区分
并发(Concurrency)和并行(Parallelism)是计算机科学中两个相关的但又不同的概念。
- 并发指利用时间轮片,交替运行多个任务的能力。并发允许多个任务轮流交替执行,并共享资源(例如硬盘,网络或单个CPU)
- 并行指利用多核CPU,同时运行多个任务的能力。并行允许多个任务在各自独立的资源下执行
2. Python实现
根据并行和并发的特点,很容易联想到进程和线程(进程 Vs 线程-CSDN博客)。Python中利用不同的机制,实现并行和并发编程:
- 并行编程:利用multiprocessing库实现多进程开发
- 并发编程:利用threading,coroutines实现多线程和协程开发
2.1 multiprocessing
Python中multiprocessing库实现了将应用程序中的任务拆分,交给多个进程处理,从而提升允许效率。
入门案例
程序中具有两个任务,通过mulitprocessing.Process为不同的任务创建子进程,并在子进程中运行相关任务。
import multiprocessing
import os# 定义两个不同的任务
def worker1():print(f"运行worker1任务的进程ID为:{os.getpid()}")def worker2():print(f"运行worker2任务的进程ID为:{os.getpid()}")if __name__ == "__main__":print(f"主进程的ID为:{os.getpid()}")# 为不同的任务创建不同的子进程p1 = multiprocessing.Process(target=worker1)p2 = multiprocessing.Process(target=worker2)# 启动子进程p1.start()p2.start()# 打印不同子进程的IDprint(f"p1进程的ID为:{p1.pid}")print(f"p2进程的ID为:{p2.pid}")# 主进程等待子进程的完成p1.join()p2.join()print("p1和p2子进程已经全部完成")# 查看子进程的状态print(f"p1进程是否存活:{p1.is_alive()}")print(f"p2进程是否存活:{p2.is_alive()}")
数据共享
数据不共享案例说明
由于线程之间的内存空间是相互独立的,线程不支持数据共享,可以通过下面的案例来说明。
import multiprocessing# 定义一个全局result变量
result = []# 定义一个任务,把列表中每个元素的平方值,添加到全局变量中
def square_list(mylist: list):global resultfor num in mylist:result.append(num * num)print(f"子进程中的resu