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模块的使用可以优化处理多个任务的性能,加快任务处理的速度,提升系统性能。