深入探究Python中的多进程模块用法实例
作者:简讯Alfred 爱生活爱扣钉
什么是多进程
多进程是计算机编程中的一个概念,也可以说是一种可用于实现并行性和利用多个 CPU 内核或处理器并发执行任务的技术。这种技术尤其适用于受 CPU 限制的任务,并行执行可以提高程序的性能。Python 提供了多进程模块来处理多个进程。
多进程(Multiprocessing)是一种计算机编程和执行范式,涉及多个进程或程序的同时执行,方法是根据我们正在处理的问题或设置,在单台计算机或多台计算机上利用多个 CPU 内核或处理器。
多进程是并行的一种形式,旨在通过允许任务并发执行来提高程序性能和效率,从而有效利用可用的计算资源。
下文将讨论多进程的几个组成部分。
1. 进程:每个任务或工作单位或进程都封装在一个单独的进程中,这是一个独立的程序执行单元。这些进程可以相互独立地同时运行。
2. 并行执行:多个进程(如计算、数据处理或多个请求处理)可以通过多进程并行执行,从而同时执行任务。
3. 资源利用:多处理是一种技术,通过将任务分配给多个 CPU 内核,有效利用现代计算机的处理能力,尤其是多核处理器(如四核或八核)。
4. 隔离:在多进程中,进程之间是相互隔离的。这意味着,一个进程的操作或故障不会直接影响其他进程。这种隔离处理增强了系统的稳定性。
5. 进程间通信(IPC):进程间通信机制(如共享内存、管道、队列和套接字)允许进程交换数据并协调其活动。
6. 可扩展性:多进程可以进行扩展,以利用许多处理器甚至分布式计算集群的能力来解决计算密集型问题。
多线程与多进程的区别
想象一下你和两个助手在厨房里做饭。多线程就像是让这两个助手在同一个厨房里完成一项任务。这无疑会加快进程,两个人同时完成一项任务。在同一个厨房工作的这些助手可以共享相同的食材,可以互相交流,可以轻松分担任务。但是也可能会变得混乱,他们在工作时可能会相互碰撞,从而破坏所有的进度。
多进程就像有两个帮手,在两个不同的厨房工作,使用各自的食材和个人空间。这些助手可以独立工作,互不干扰,但如果他们需要分享食材或交谈,就必须使用电话。
从这个例子中,我们可以了解到,多线程是一种很好的技术,适用于助手不需要频繁移动的任务,因为处理器不需要使用大量资源。然而多进程更适合需要大量移动的任务,或者从技术上讲需要同时使用内核的大量资源的任务。
如果我们用一句话来定义,多线程主要是实现并发性,允许任务在时间上重叠,而多进程则是实现真正的并行性,因为每个进程都在不同的 CPU 内核或处理器上独立运行。
在 python 中执行多进程的第一步是导入模块。
import multiprocessing
我们要使用多进程来运行一个程序。让我们创建一个用户自定义程序示例,看看如何操作:
def test(): print("This is my sample program") test() # Output: # This is my sample program
要使用多进程调用该程序,我们将使用以下代码。
import multiprocessing def test01(): print("This is a sample multiprocessing program") if __name__ == "__main__": m = multiprocessing.Process(target=test01) print("this is my main program") # start the program m.start() # stop/terminate the program and release the resource m.join()
在上面的代码中,我们通过 main
函数使用多进程调用我们要处理的程序。并且确保只有在直接执行该脚本时,而不是作为模块导入时,代码才会运行。
我们还可以在其他函数中使用多进程,执行一些逻辑运算,下面给出了一个例子。
import multiprocessing def square(n): return n**2 if __name__ == '__main__': with multiprocessing.Pool(processes=5) as pool: out = pool.map(square, [12,2,3,5,23,14,26,8,4,6]) print(out) # Output: # [144, 4, 9, 25, 529, 196, 676, 64, 16, 36]
并行执行函数
运行多个进程
我们可以使用多进程技术在多个内核上运行多个进程。我们创建并启动多个进程,每个进程都运行带有一组参数的函数 "workers"(如下代码所示)。我们使用 "args "来指定函数要使用的参数列表。
在下面的代码中,我们使用多进程的概念,使用 4 个进程来处理程序。为此,我们使用了 python 中多进程模块的 Process
方法。
def workers(num): print(f"Worker number {num}") if __name__ == "__main__": processes = [] for i in range(4): process = multiprocessing.Process(target=workers, args=(i,)) processes.append(process) process.start() for process in processes: process.join() Output: Worker number 0 Worker number 1 Worker number 2 Worker number 3
进程间共享数据
使用 multiprocessing.Queue
multiprocessing.Queue
是 Python 编程语言中的一个类,由 multiprocessing
模块提供,我们用它来执行 python 中的多进程处理。这里的 Queue
用于促进多进程程序中不同进程之间的通信和数据交换。
multiprocessing.Queue
的一些主要功能和用途如下:
• 进程间通信:它允许多个进程通过使用共同的数据结构(队列)安全地交换数据。每个进程都可以将数据放入队列或从中检索数据。
• 线程安全:它的设计方式确保了线程安全和进程安全,这意味着它可以在多线程或多进程环境中安全使用,而不会出现竞赛条件或数据损坏。
• 先进先出队列始终遵循 FIFO 即先进先出原则,这意味着第一个放入队列的项目也将是第一个出来的项目。
• 阻塞操作:当一个进程试图从一个空队列中检索一个项目或向一个已填满的队列中插入一个项目时,该操作将阻塞,直到条件发生变化。这种进程/行为对于进程间的同步非常有用。
在使用 Python 进行并行或并发处理时,multiprocessing.Queue
是一个非常有用的工具,尤其是在多个进程需要共享和协调数据的情况下。
下面的单元格给出了一个如何使用 multiprocessing.Queue
的示例:生产者进程生产数据或将数据放入队列,消费者进程从队列中消费数据。多进程队列 确保了两个进程之间安全的数据交换。
import multiprocessing import time #defining our function we want to apply multiprocessing on #01 the producer function to add elements in the queue def producer(q): for item in range(5): q.put(item) print(f"Produced: {item}") #02 consumer function to get elements from the queue def consumer(q): while True: item = q.get() if item is None: break print(f"Consumed: {item}") if __name__ == "__main__": #creating a multiprocessing queue q = multiprocessing.Queue() #creating the producer and consumer processes producer_process = multiprocessing.Process(target=producer, args=(q,)) consumer_process = multiprocessing.Process(target=consumer, args=(q,)) #starting the processes producer_process.start() consumer_process.start() #finish the producer, signal the consumer to exit producer_process.join() q.put(None) #signaling the consumer about no more data in the queue consumer_process.join() Output: Produced: 0 Produced: 1 Consumed: 0Produced: 2 Produced: 3Consumed: 1 Produced: 4 Consumed: 2 Consumed: 3 Consumed: 4
进程池
使用 multiprocessing.Pool 类
multiprocessing.Pool 是 python 中 multiprocessing 模块提供的另一个类。它用于创建和管理可并行执行任务的进程池。该类简化了并行任务并将其分配给多个进程的过程。
下面列出了 multiprocessing.Pool 的一些功能和用途。
• multiprocessing.Pool 用于在 python 中实现并行处理。它允许我们并发执行多个任务,充分利用多核 CPU 的优势,并有可能提高 CPU 相关操作的性能。
• 任务分配:我们可以使用 multiprocessing.Pool 在工作进程池中分配任务。它对工作进程的管理进行了抽象,使并行工作变得更容易。
• 资源管理:进程池会根据可用的 CPU 内核自动管理工作进程的创建和销毁。我们可以指定要使用的工作进程数量,其余的由进程池处理。
• 负载平衡:进程池会在工作进程之间有效分配任务,确保每个工作进程都能获得同等的工作量。这种负载平衡对于优化并行处理至关重要。
• 结果收集:我们可以从工作进程中收集结果。当任务产生的结果需要汇总或进一步处理时,这一点尤其有用。
• 上下文管理器:它还可以充当上下文管理器,确保在不再需要时正确关闭池并终止工作进程。
下面的单元格显示了一个使用 multiprocessing.Pool 的示例代码,通过一个返回给定数字平方的简单函数对进程进行多进程处理。
def square(x): return x**2 if __name__=='__main__': #create a multiprocessing pool with 4 worker processes with multiprocessing.Pool(processes=4) as pool: #distribute the tasks among worker processes and collect results results = pool.map(square, [2,5,3,2,1,7,8,5,6,2,2,3]) #print the results print(results) Output: [4, 25, 9, 4, 1, 49, 64, 25, 36, 4, 4, 9]
以上就是深入探究Python中的多进程用法实例的详细内容,更多关于Python 多进程的资料请关注脚本之家其它相关文章!