社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python多进程学习

马哥Linux运维 • 1 年前 • 150 次点击  

Python 多进程 (Multiprocessing) 是一种同时利用计算机多个处理器核心 (CPU cores) 进行并行处理的技术,它与 Python 的多线程 (Multithreading) 技术不同,因为多线程的并发任务依赖于一个 GIL (Global Interpreter Lock)。在多进程中,每个进程都有自己的解释器进程,并且可以同时使用多个 CPU 核心,因此在处理计算密集型任务时比多线程更有效。

要使用 Python 的多进程,我们需要使用内置的 multiprocessing 模块,该模块提供了创建和管理进程的类和函数,下面是一个简单的 Python 多进程的例子:

import multiprocessing

def worker():
   """子进程的工作函数"""
   print("Starting worker")
   # 这里可以放一些耗时的任务
   print("Finished worker")

if __name__ == '__main__':
   # 创建一个子进程
   p = multiprocessing.Process(target=worker)
   # 启动子进程
   p.start()
   # 等待子进程结束
   p.join()
   print("Parent process finished")

在这个例子中,我们定义了一个函数 worker(),这个函数是子进程要执行的任务,我们使用 multiprocessing.Process 类创建了一个子进程,并将 worker() 函数作为参数传递给 target 参数,然后我们使用 start() 方法启动子进程, join() 方法等待子进程完成,最后,主进程会输出一条消息,表示自己已经完成了。

除了创建单个子进程,我们还可以使用 Pool 类来创建多个子进程,以便并行处理多个任务,下面是一个使用 Pool 类的例子:

import multiprocessing

def worker(num):
   """子进程的工作函数"""
   print(f"Starting worker {num}")
   # 这里可以放一些耗时的任务
   print(f"Finished worker {num}")

if __name__ == '__main__':
   # 创建一个包含 4 个进程的进程池
   with multiprocessing.Pool(processes=4as pool:
       # 使用 map 函数并行执行 worker 函数
       pool.map(worker, [1234])
   print("Parent process finished")

在这个例子中,我们使用 Pool 类创建了一个包含 4 个进程的进程池,然后我们使用 map() 方法并行执行 worker() 函数。map() 方法会将参数列表中的每个参数依次传递给 worker() 函数,并将返回值收集到一个列表中。最后,主进程会输出一条消息,表示自己已经完成了。

当我们需要执行一些计算密集型的任务时,使用 Python 的多进程技术可以显著提高程序的执行效率,下面是一些使用 Python 的多进程技术的常见场景:

  1. 数据处理:当我们需要处理大量的数据时,可以使用多进程技术将数据分成多个部分,并同时处理它们。

  2. 网络爬虫:当我们需要爬取大量的网页时,可以使用多进程技术将不同的任务分配给不同的进程,从而并行地执行它们。

  3. 图像处理:当我们需要对大量的图像进行处理时,可以使用多进程技术并行执行不同的处理任务。

在使用 Python 的多进程技术时,我们需要注意一些问题:

  1. 进程间通信:由于每个进程都有自己的内存空间,因此它们之间不能直接共享数据,我们需要使用 multiprocessing 模块提供的管道、队列等机制来实现进程间通信。

  2. 进程池:在使用 Pool 类时,我们需要注意控制并发任务的数量,以免占用过多的系统资源。

  3. 内存限制:由于每个进程都有自己的内存空间,因此如果同时创建太多的进程,会占用过多的系统内存,导致程序崩溃。

下面是一个使用进程池并行执行任务的例子,其中使用了 imap_unordered() 方法来异步执行任务:

import multiprocessing
import time

def square(x):
   """计算平方"""
   time.sleep(1)  # 模拟耗时的计算
   return x * x

if __name__ == '__main__':
   # 创建进程池
   with multiprocessing.Pool() as pool:
       # 异步执行任务
       for result in pool.imap_unordered(squarerange(10)):
           print(result)

在这个例子中,我们创建了一个包含默认进程数的进程池,然后使用 imap_unordered() 方法并行执行 square() 函数。imap_unordered() 方法会返回一个迭代器,每次迭代都会返回一个已经完成的任务的结果。由于我们使用了异步执行,因此任务的返回顺序不一定与参数的顺序相同。

除了使用 imap_unordered() 方法,我们还可以使用 imap() 方法,它会按照参数的顺序返回任务的结果,此外,我们还可以使用 apply()apply_async() 方法来执行单个任务或异步执行单个任务。

总的来说,使用 Python 的多进程技术可以帮助我们更有效地处理计算密集型任务,通过使用 multiprocessing 模块和 Pool 类,我们可以轻松地创建和管理多个子进程,并使它们并行地执行任务。

文章来源于网络,版权归原作者所有,侵删。


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/153955
 
150 次点击