python中的并发/并行与多线程/多进程/异步的关系
文章目录
- 一、并发和并行的相关介绍
- (一)并发
- (二)并行
- 二、并发和并行的实现方式
- (一)并发与多线程 / 异步的关系大致介绍
- (二)并行与多进程的关系大致介绍
- (三)实现并发的方式
- 1. 多线程实现
- 2. 异步实现
- (四)实现并行的方式
- 1. 多进程实现
- (五)总结
一、并发和并行的相关介绍
(一)并发
- 并发是指两个或多个事件在同一时间间隔内发生,计算机领域表现为多个任务在一段时间内交替执行,宏观上看似同时进行。例如,电脑同时运行浏览器、音乐播放器等多个应用程序,它们交替获取 CPU 时间片来执行操作。
(二)并行
- 并行是指两个或多个事件在同一时刻同时发生,在计算机硬件环境,当有多个处理器或多个 CPU 核心时,多个任务可真正同时执行。比如,在 4 核 CPU 计算机上,可同时运行 4 个独立程序,每个核心负责一个程序。
二、并发和并行的实现方式
(一)并发与多线程 / 异步的关系大致介绍
- 多线程与并发 :多线程是实现并发的常见方式,一个进程包含多个线程,这些线程共享进程的资源,并且可以独立执行。在单核 CPU 环境下,操作系统通过快速切换线程,使得多个线程看起来像是同时在运行,从而实现了并发的效果。
- 异步与并发 :异步操作通常与并发相结合。异步调用会返回一个占位符,当操作完成时,会通知调用者或者将结果返回给调用者。例如,在进行网络请求等 IO 密集型操作时,可以采用异步方式,这样在等待响应的过程中,程序可以继续执行其他代码,从而实现并发执行任务的效果。
(二)并行与多进程的关系大致介绍
- 多进程与并行 :多进程是实现并行的重要方式。在多核 CPU 环境下,多个进程可以被分配到不同的处理器核心上,每个进程拥有自己独立的内存空间和资源,它们可以同时执行,真正实现了并行处理。例如,在分布式计算任务中,多个计算节点(即多个进程)可以同时处理不同的数据子集,从而提高整体的计算效率。
(三)实现并发的方式
1. 多线程实现
- 创建线程的方式 :在 Python 中,可以使用
threading
模块来创建多线程。通过继承Thread
类或者定义线程任务函数来实现。 -
import threadingdef task(name):for i in range(5):print(f"{name} - {i}")thread1 = threading.Thread(target=task, args=("Thread1",)) thread2 = threading.Thread(target=task, args=("Thread2",)) thread1.start() thread2.start() thread1.join() thread2.join()
- 线程通信和同步 :线程共享进程资源,需进行通信和同步。Python 中可用
threading.Lock
等来保证线程安全,避免多个线程同时访问共享变量导致数据错误。
2. 异步实现
-
import asyncioasync def task(name):for i in range(5):print(f"{name} - {i}")await asyncio.sleep(0) # 模拟异步操作,交出控制权async def main():task1 = asyncio.create_task(task("Task1"))task2 = asyncio.create_task(task("Task2"))await task1await task2asyncio.run(main())
- 在这个异步示例中,通过
async
和await
关键字来实现异步操作。当执行到await asyncio.sleep(0)
时,当前任务会暂停,允许其他任务执行,从而实现并发。
(四)实现并行的方式
1. 多进程实现
- 在操作系统层面 :操作系统提供创建进程的系统调用,如 Linux 系统的
fork()
。新进程复制父进程资源,独立运行。多核 CPU 环境下,多个进程可分配到不同核心并行处理。 - 在编程语言层面 :在 Python 中,可以使用
multiprocessing
模块来创建多进程。 -
import multiprocessingdef process_task(name):for i in range(5):print(f"Process {name}: {i}")if __name__ == "__main__":p1 = multiprocessing.Process(target=process_task, args=("Process1",))p2 = multiprocessing.Process(target=process_task, args=("Process2",))p1.start()p2.start()p1.join()p2.join()
- 这段代码启动了两个进程来执行任务,在多核 CPU 环境下可并行执行。
(五)总结
- 并发和并行都为提高程序效率,利用计算机资源。
- 并发侧重任务交替执行,通过多线程、多进程和异步等方式实现,适用于单核资源充分利用及 IO 密集型任务。
- 并行侧重任务同时执行,依赖多核处理器资源,多进程实现常见,适合计算密集型任务。
- 实际应用中,可根据需求和硬件环境选择合适实现方式,有时可混合使用并发和并行技术,如在多核计算机上开发的网络服务程序,用多线程处理并发连接,用多进程并行处理计算密集型业务逻辑。