Python 3.x 中如何使用multiprocessing模块进行多进程管理

1. 简介

Python中的multiprocessing模块可以实现多进程的管理,可以应对一些需要并发处理的场景,比如多线程,多进程的爬虫,数据处理等等。本文将介绍Python 3.x中multiprocessing模块的使用方法。

2. 安装multiprocessing

Python 3.x版本自带multiprocessing模块,不需要安装。如果使用其他Python版本的用户可以通过pip install multiprocessing进行安装。

3. 创建进程

在multiprocessing模块中创建进程可以使用Process类创建。Process类的构造函数有两个参数,第一个参数为被调用的函数名,第二个参数为被调用函数的参数。

3.1 创建子进程

import multiprocessing

def hello_world():

print('Hello World!')

process = multiprocessing.Process(target=hello_world)

process.start()

process.join()

首先引入multiprocessing模块,定义了一个被调用函数hello world,使用Process类创建了一个进程process,并且target指定了被调用函数,使用start方法启动进程,使用join方法阻塞进程,因为子进程结束后需要等待父进程结束。

3.2 创建多个子进程

使用for循环创建多个子进程:

import multiprocessing

def hello_world(i):

print('Hello World %d!' % i)

for i in range(5):

process = multiprocessing.Process(target=hello_world, args=(i,))

process.start()

process.join()

使用for循环创建多个进程,被调用函数带有一个参数i,需要传递该参数到子进程中使用args参数传递。

4. 进程间通信

多个进程之间需要进行通信,可以使用Queue进行通信。Queue支持线程和进程安全。

4.1 父进程往子进程发送数据

import multiprocessing

def receive(queue):

print('Receive: %s' % queue.get())

if __name__ == '__main__':

queue = multiprocessing.Queue()

process = multiprocessing.Process(target=receive, args=(queue,))

process.start()

queue.put('Hello World')

process.join()

在父进程中创建Queue,使用Process创建进程process,并且把Queue传递给Process的被调用函数,使用put方法向Queue中放入数据。

4.2 子进程往父进程发送数据

import multiprocessing

def send(queue):

queue.put('Hello World')

if __name__ == '__main__':

queue = multiprocessing.Queue()

process = multiprocessing.Process(target=send, args=(queue,))

process.start()

print('Received: %s' % queue.get())

process.join()

在父进程中创建Queue,使用Process创建进程process,并且把Queue传递给Process的被调用函数,使用get方法从Queue中获取数据。

5. 进程池

在处理多个进程的场景中,创建大量的子进程会导致系统性能下降,这时就需要使用进程池,将子进程的创建数量限制在一定的范围内。

5.1 创建进程池

import multiprocessing

def hello_world(i):

print('Hello World %d!' % i)

if __name__ == '__main__':

pool = multiprocessing.Pool(processes=2)

for i in range(5):

pool.apply_async(hello_world, (i,))

pool.close()

pool.join()

在父进程中创建进程池pool,将进程池指定为2,使用for循环创建多个进程。apply_async方法可以异步调用子进程,并且将hello_world被调用函数和参数传递进去。

5.2 监听进程池执行状态

ProcessPoolExecutor类是一个高级接口类,可以监视执行状态,使用add_done_callback注册状态回调函数,回调函数会在进程池中进程执行完毕后被调用。

import concurrent.futures

import multiprocessing

def hello_world(i):

print('Hello World %d!' % i)

return i * i

def callback(result):

print('Got:', result.result())

if __name__ == '__main__':

with concurrent.futures.ProcessPoolExecutor(max_workers=2) as executor:

for i in range(5):

future = executor.submit(hello_world, i)

future.add_done_callback(callback)

在父进程中使用了concurrent.futures.ProcessPoolExecutor创建进程池,在使用submit方法异步执行线程,使用add_done_callback注册回调函数callback,回调函数会在线程执行完毕后被调用。

总结

本文介绍了Python 3.x中multiprocessing模块的使用方法,包括创建进程,进程间通信及进程池等内容。multiprocessing模块的使用可以优化处理多个任务的性能,加快任务处理的速度,提升系统性能。

后端开发标签