Python中multiprocessing使用

1. 概述

multiprocessing是Python的一个库,用于在同一台计算机的不同CPU核之间并行执行代码。它通过使用进程(而不是线程)实现并行,因此可以避免Python中全局解释器锁(GIL)的限制。

multiprocessing库提供了一种类似于线程的API,但它是基于多个进程的。它使得开发者能够编写可以在不同的进程中运行的代码,并且这些进程之间可以通过管道或共享内存进行通信。

2. 使用方法

2.1 Process类

Process类是multiprocessing的核心类之一,用于创建和控制进程。它的构造函数有两个必须的参数——target和args。其中,target是一个函数或方法,表示要在新进程中执行的代码;args是一个元组或列表,表示传递给target函数的参数。

以一个简单的示例来说明Process类的使用方法:

import multiprocessing

import time

def worker(num):

    print('Worker %d starts working.' % num)

    time.sleep(3)

    print('Worker %d ends working.' % num)

if __name__ == '__main__':

    jobs = []

    for i in range(5):

        p = multiprocessing.Process(target=worker, args=(i,))

        jobs.append(p)

        p.start()

    for j in jobs:

        j.join()

在该示例中,我们定义了一个worker函数,模拟一个工作进程,每个工作进程都会执行一个类似于“忙等待”的操作(time.sleep(3)),并打印出工作进程编号。在主进程中,我们使用Process类创建5个工作进程对象,然后运行它们并等待所有工作进程结束(通过p.join()实现)。

2.2 Pool类

对于一组需要执行相同任务的进程,可以使用Pool类来批量创建和管理它们。Pool类提供了常用的方法,例如apply_async()、map()、imap_unordered()等,用于提交任务和获取结果。

下面是一个简单的示例:

import multiprocessing

import time

def worker(num):

    print('Worker %d starts working.' % num)

    time.sleep(3)

    print('Worker %d ends working.' % num)

    return num

if __name__ == '__main__':

    pool = multiprocessing.Pool(processes=5)

    results = pool.map(worker, range(5))

    pool.close()

    pool.join()

    print(results)

在该示例中,我们定义了一个worker函数,模拟一个工作进程,并返回进程编号。在主进程中,我们使用Pool类创建一个拥有5个进程的进程池(pool),然后使用map()方法提交五个任务,并等待所有任务执行完毕。最后,任务的结果会以一个列表的形式返回,并打印出来。

3. 注意事项

使用multiprocessing库时需要注意以下几点:

(1)由于各个进程之间的环境是独立的,所以它们之间无法共享变量,必须使用multiprocessing提供的队列、管道、共享内存等方式进行通信和数据共享。

(2)使用multiprocessing库时,需要注意多进程之间不能直接使用全局变量,这会导致数据错乱或无法共享。一般来说,可以将全局变量传递给进程或使用共享内存等方式进行数据传输。

(3)与多线程相比,多进程的启动和销毁时间较长,因此在使用时需要考虑进程创建和销毁的开销,以及进程间通信的开销。

(4)在使用多进程时,要注意避免死锁和竞争状态等并发编程的问题。可以使用锁、信号量等方式确保进程之间的同步和安全。

你可能感兴趣的:(python基础入门,python)