深入浅析python中的多进程
更新时间:2023-11-09Python中的多进程
多进程指的是同时执行多个进程任务,每个进程都独立于其他进程运行。Python通过multiprocessing模块实现了多进程,在这个模块中提供了一个Process类,可以创建一个新的进程来执行指定的函数。下面我们将从以下几个方面深入浅析Python中的多进程:
1.使用方式
使用multiprocessing创建进程非常简单,只需要定义一个函数,然后将其传递给Process类的构造函数即可。下面是一个简单的例子:
from multiprocessing import Process def func(): print("子进程开始执行") if __name__ == '__main__': p = Process(target=func) p.start() print("主进程执行结束")
在这个例子中,我们定义了一个func函数,然后将其传递给Process类的构造函数。在主程序中,我们创建了一个进程对象p,并通过调用p.start()方法启动了这个进程。在子进程p中,它执行了func函数,打印出了一条消息。在主进程中,它继续执行了一条语句,打印出了"主进程执行结束"。
2.进程的参数和返回值
如果函数需要接收参数,我们可以将这些参数作为Process类的构造函数的参数进行传递。如果函数需要返回值,我们可以使用Queue(队列)数据结构实现进程之间的通信。下面是一个例子:
from multiprocessing import Process, Queue def func(num, q): result = num * num q.put(result) if __name__ == '__main__': q = Queue() p = Process(target=func, args=(10, q)) p.start() p.join() result = q.get() print(result)
在这个例子中,我们定义了一个func函数,它接收一个num参数,并计算num的平方并将结果存储到队列q中。在主程序中,我们创建了一个队列对象q,并将其与进程对象p关联起来。然后启动进程p,并在进程p执行结束后,获取并打印出队列q中存储的结果。
3.进程之间的通信
除了使用队列进行进程之间的通信,Python的multiprocessing模块还提供了一些其他的进程间通信方式,比如:Pipe(管道)、Value(共享单个值)。下面是一个使用Pipe进行进程间通信的例子:
from multiprocessing import Process, Pipe def func(conn): conn.send('hello from child process') print('message from parent:', conn.recv()) conn.close() if __name__ == '__main__': parent_conn, child_conn = Pipe() p = Process(target=func, args=(child_conn,)) p.start() print('message from child:', parent_conn.recv()) parent_conn.send('hello from parent process') p.join()
在这个例子中,我们创建了两个连接对象:parent_conn和child_conn,它们代表了一个双向通信的管道。然后我们定义了一个func函数,并将child_conn对象作为它的参数。在func函数中,我们首先通过child_conn.send()方法向父进程发送了一条消息,然后使用conn.recv()方法从父进程接收了一条消息。在主程序中,我们通过parent_conn.recv()方法从子进程中接收了一条消息,并使用parent_conn.send()方法向子进程发送了一条消息。
4.进程池
在实际应用中,我们可能需要同时启动多个进程来执行指定的函数。在这种情况下,使用进程池可以更好地管理和分配进程资源。在Python中,multiprocessing模块提供了Pool类来实现进程池的功能。下面是一个例子:
from multiprocessing import Pool import random import time def func(num): print("process %d starts" % num) time.sleep(random.randint(1, 5)) print("process %d ends" % num) if __name__ == '__main__': pool = Pool(processes=4) nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] pool.map(func, nums)
在这个例子中,我们定义了一个func函数,它接收一个num参数,并在函数中打印出"process num starts"和"process num ends"的消息。在主程序中,我们创建了一个进程池对象pool,并通过pool.map()方法将num列表传递给func函数。在这个例子中,我们指定了进程池的容量为4,表示最多同时会有4个进程在执行。
总结
Python的multiprocessing模块实现了多进程的功能,使用简单,可以通过Process类轻松地创建新的进程。同时,Python提供了Queue、Pipe、Value等多种进程间通信方式,方便进程之间的数据交换。当需要同时启动多个进程执行指定任务时,使用进程池可以更好地管理和分配资源。