Python多进程multiprocessing用法实例分析
本文将详细介绍Python内置库multiprocessing的用法,包括创建进程、进程间通信以及进程池等方面,同时会提供两个示例来帮助读者更好地理解使用multiprocessing进行并发编程的思想。
创建进程
Python的multiprocessing
库提供了Process
类来创建进程。以下是一个示例:
import multiprocessing
def foo():
print('Process {}: hello, world!'.format(multiprocessing.current_process().name))
if __name__ == '__main__':
p = multiprocessing.Process(target=foo)
p.start()
p.join()
在该示例中,我们通过调用multiprocessing.Process
来创建一个新的进程,在target
参数中指定要运行的函数。start()
方法会使进程开始执行,join()
方法则会等待进程执行完毕后才会继续执行当前进程。
进程间通信
在多进程编程中,进程间通信是非常重要的一部分。Python提供了多个用于实现进程间通信的方法,例如Queue
、Pipe
和shared memory
等。
以下是一个基于Pipe
的示例:
import multiprocessing
def sender(conn):
conn.send('hello from sender')
conn.close()
def receiver(conn):
msg = conn.recv()
print('Process {}: received {}'.format(multiprocessing.current_process().name, msg))
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = multiprocessing.Pipe()
p1 = multiprocessing.Process(target=sender, args=(child_conn,))
p2 = multiprocessing.Process(target=receiver, args=(parent_conn,))
p1.start()
p2.start()
p1.join()
p2.join()
在该示例中,我们通过调用multiprocessing.Pipe
来创建一个管道,并将它分成父进程和子进程两端。sender
函数向管道写入一条消息,receiver
函数从管道中读取消息并打印。在主进程中,我们创建了两个进程来代表管道的两端,并启动它们。最后,我们等待两个进程执行完毕,释放资源。
进程池
进程池是一种非常常用的并发编程方法,通过预先创建一组进程然后通过任务调度来共享它们来实现并发。Python中,multiprocessing.Pool
提供了进程池接口。
以下是一个进程池的示例:
import multiprocessing
def worker(num):
print('Process {} is working on task {}'.format(multiprocessing.current_process().name, num))
return num * 2
if __name__ == '__main__':
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
with multiprocessing.Pool(processes=3) as pool:
results = pool.map(worker, nums)
print(results)
在该示例中,我们将函数worker
作为任务提交到进程池中执行,并将所用到的参数传递给map
方法(相当于Python内置函数map
),等待所有任务执行完成后,我们会得到所有任务的返回结果。
示例1
假设我们需要对列表中的元素进行一个昂贵的计算,同时希望可选择地使用并发来加速计算,以下是示例代码:
import time
import multiprocessing
def do_expensive_calculations(num):
time.sleep(1) # 模拟一些昂贵的计算
return num ** 2
if __name__ == '__main__':
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
use_multiprocessing = True # 是否使用多进程
results = []
if use_multiprocessing:
with multiprocessing.Pool(processes=3) as pool:
results = pool.map(do_expensive_calculations, nums)
else:
for n in nums:
results.append(do_expensive_calculations(n))
print(results)
在该示例中,我们可以通过设置use_multiprocessing
变量来选择是否使用多进程运行。在使用多进程时,我们需要构建一个进程池并等待它完成工作。
示例2
假设我们需要运行两个相互独立的长时间任务,以下是示例代码:
import time
import multiprocessing
def task1():
time.sleep(3)
print('Task 1 finished')
def task2():
time.sleep(5)
print('Task 2 finished')
if __name__ == '__main__':
p1 = multiprocessing.Process(target=task1)
p2 = multiprocessing.Process(target=task2)
p1.start()
p2.start()
p1.join()
p2.join()
print('All tasks finished')
在该示例中,我们使用multiprocessing.Process
创建两个独立的进程来运行task1
和task2
函数,等待它们完成后再继续运行。同时,我们将task1
和task2
的运行时间设置不同来模拟两个相互独立的长时间任务的情况。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python多进程multiprocessing用法实例分析 - Python技术站