Python中如何使用多进程?multiprocessing模块详解

Python中通过多处理模块实现多处理的主要方式是使用Process类创建进程,与队列、管道或共享内存通信,并通过Pool管理大量任务。
以下是分步说明: 1 . 创建和启动基本进程 使用 multiprocessing.Process 类创建独立进程。
每个进程都有独立的Python解释器和内存空间,可以绕过GIL实现并行计算。
主要步骤:定义目标函数(流程要执行的逻辑)。
创建一个 Process 对象并指定 target(目标函数)和 args(参数)。
调用 start() 启动进程,调用 join() 等待进程完成。
importmultiprocessingimportsimporttimedefworker_function(name,delay):pid=os.getpid()print(f"进程 {pid}({name}) 已开始工作...") time.sleep(delay)print(f"进程 {pid}({name}) 已完成其工作。
")if__name__=='__main__':process1 =multiproces sing.Process(target=worker_function,args=("任务A",2 ))process2 =multiprocessing.Process(target=worker_function,args=("Task B",1 ))process1 .start()process2 .start()process1 .join()process2 .join()print("所有子进程已完成,主进程已结束。
") 要点: if__name__=='__main__':: 应该在 Windows 系统上使用,以避免子进程重复导入模块导致无限递归。
并行性:start()后,主进程继续运行,子进程在后台运行,实现并行性。
2 .多进程和多线程 多线程:共享同一进程的内存空间,适合I/O密集型任务(如网络请求、读写文件)。
受GIL的限制,CPU密集型任务无法真正并行化。
多进程:每个进程都有独立的内存空间,适合CPU密集型任务(如数学运算、数据处理)。
没有GIL限制,可以充分利用多核CPU。
3 .进程间通信(IPC) 进程不共享内存,必须通过以下机制进行通信: (1 )队列(queue)特性:线程/进程安全,支持生产者-消费者模型。
示例: importmultiprocessingdef Producer(queue):foriinrange(5 ):queue.put(f"Message{i}")queue.put(None)#最终信号 defconsumer(queue): whileTrue:msg=queue.get()ifmsgisNone:breakprint(f"Consumer 收到:{msg}")if__nam e__=='__main__':q=multiprocessing.Queue()p1 =multiprocessing.Process(target= Producer,args=(q,))p2 =multiprocessing.Process(target=consumer,args=(q,))p1 .start()p2 .start()p1 .join()p2 .join() (2 )特性 管道(Pipe):轻量级,仅适合两个进程之间的双向或单向通信。
示例: importmultiprocessingdefsender(conn):conn.send("嗨,我是发件人!")conn.close()defreceiver(conn):msg=conn.recv()print(f"收件人收到:{msg}")conn.close()if__name__=='__main__':parent_conn,child_conn =multiprocessing.Pipe()p1 =multiprocessing.Process(target=sender,args=(child_conn,))p2 =multiprocessing.Process(target=receiver,args=(parent_conn,))p1 .start()p2 .start()p1 .join()p2 .join() (3 ) SharedMemory 特性:直接共享值或数组,需要手动同步(如使用 Lock)。
示例: importmultiprocessingdefincrement(num,arr,lock):lock.acquire()try:num.value+=1 foriinrange(len(arr)):arr[i]+=1 finally:lock.release()if__name__=='__main__':num=multiprocessing.Value('i',0)arr=multiprocessing.Array('i',[0,0,0])lock=multiprocessing.Lock()processes=[]foriinrange(3 ):p=multiprocessing.Process(target=increment,args=(num,arr,lock),name=f"Worker-{i}")processes.append(p)p.start()forpinprocesses:p.join()print(f"最终结果:num={num.value},arr={list(arr)}") 4 .进程池(Pool)管理大量任务。
Pool类自动管理流程生命周期,简化任务分发和结果收集,适合处理大量独立任务。
主要优点: 资源控制:限制最大进程数(进程 = 4 )。
任务分配:通过map或apply_async分配任务。
结果收集:自动聚合结果,避免手动同步。
常用方法: pool.map(func,iterable):分块并行执行,与内置map类似。
importmultiprocessingdefsquare(x):returnx*xif__name__=='__main__':withmultiprocessing.Pool(processes=4 )aspool:results=pool.map(square,range(1 0))print(f"results:{results}") pool.apply_async(func,args):非阻塞提交任务并返回 AsyncResult 对象。
importmultiprocessingdefcomplex_task(a,b):returnf"{a}+{b}={a+b}"if__name__=='__main__':withmultiprocessing.Pool(processes=3 )aspool:async_result1 =pool. apply_async(complex_task,args=(1 ,2 ))async_result2 =pool.apply_async(complex_task,args=(3 ,4 ))print(async_result1 .get())#阻塞获取结果 print(async_result2 .get()) 总结适用场景: 多进程:CPU密集型任务(如科学计算、图像)。
多线程:I/O密集型任务(如网页爬取、文件操作)。
关键模块: 流程:创建基本流程。
队列/管道/共享内存:进程间通信。
池:高效管理大量任务。
通过合理选择通信机制和任务管理方法,可以大大提高Python程序的并行性能。

深入理解 Python 虚拟机:进程、线程和协程

深入理解Python虚拟机:进程、线程和协程。
进程是程序执行的实体,由操作系统管理,包括代码、数据、堆和执行栈等资源。
进程可以并行运行,节省内存资源并允许多个进程同时运行。
线程是在同一进程内创建的轻量级进程。
它们共享进程资源,例如内存地址空间,适合需要修改共享内存的场景。
Linux 中的线程创建和管理是通过 NPTL 库和 pthread_create 方法实现的,允许程序高效地并行运行。
协程允许您暂停和恢复程序执行,从而实现更高效的任务调度。
在Python中,协程是基于生成器实现的,提供了更详细的并发机制。
协程比进程和线程的资源效率更高,非常适合处理大量 IO 请求。
协程的关键应用在于高并发场景,比如网络服务器开发。
协程通过事件循环进行调度,以充分利用CPU资源。
综上所述,进程、线程、协程各有各的优点和适用场景。
进程非常适合多任务并行,线程用于具有共享资源的多线程环境,协程在高并发、I/O 密集型任务中运行良好。
正确选择并发模型可以显着提高程序性能。
深入理解这些概念可以帮助开发人员在实际项目中做出更好的决策。

深入理解 Python 虚拟机:进程、线程和协程

Python虚拟机中的进程;深入理解线程和协程: 进程: 定义:进程是程序执行并由操作系统管理和维护的实体。
来源:代码;数据堆并包含进程等资源。
并行性:进程可以并行运行,实现多任务并行处理。
内存管理:每个进程都有自己的内存空间,既节省了内存资源,又允许多个进程同时运行。
线程: 定义:线程是在同一进程内创建的轻量级进程,共享进程的资源。
资源共享:线程共享进程的内存地址空间;创建和管理:在 Linux 上;线程的创建和管理通常通过NPTL库和pthread_create方法来实现。
并行执行:线程可以让程序有效地并行运行,提高执行效率。
协程: 定义:协程是一种并发机制,允许暂停和恢复程序执行。
实现:Python;协程基于生成器实现,提供更好的并发控制。
资源消耗:协程比进程和线程更具资源效率,因为它们不需要经常切换上下文。
应用场景:协程特别适合处理大量IO请求、网络服务器开发等高上下文场景。
调度:通过事件循环来调度协程,可以充分利用CPU资源,提高程序的并发性能。
结束流程;批处理和协程各有其独特的优势和相关条件。
在实际项目中;开发人员需要根据具体需求选择合适的集成模型,以优化程序性能。