每个Python程序都是一个进程,并且有一个称为主线程的线程用于执行程序指令。每个进程实际上是Python解释器的一个实例,用于执行Python指令(Python字节码),这比您在Python程序中键入的代码略低级。
有时候,我们可能需要创建新的进程来并发运行额外的任务。
Python通过multiprocessing模块中的Process类提供了真正的系统级进程。
底层操作系统控制着如何创建新进程。在某些系统上,可能需要生成一个新进程,而在其他系统上,则可能需要进行分叉。Python中用于创建新进程的操作系统特定方法并不是我们需要担心的事情,因为它由您安装的Python解释器管理。
python
# SuperFastPython.com
# example of running a function in a new process
from multiprocessing import Process
# a task to execute in another process
def task():
print('This is another process', flush=True)
# entry point for the program
if __name__ == '__main__':
# define a task to run in a new process
p = Process(target=task)
# start the task in a new process
p.start()
# wait for the task to complete
p.join()
这对于在单独的进程中运行临时的一次性任务很有用,尽管当您有许多任务需要运行时,这种方法会变得笨重。
每个创建的进程都需要分配资源(例如Python解释器的一个实例和进程主线程的堆栈空间)。如果我们为临时任务反复创建和销毁许多进程,那么设置进程的计算成本可能会变得昂贵。
相反,如果我们期望在程序中执行许多临时任务,我们更希望保留工作进程以供重复使用。
这可以通过使用进程池来实现。
进程池是一种自动管理一组工作进程的编程模式。
该池负责一定数量的进程。
它控制进程的创建时间,例如在需要时创建进程。
它还控制进程在闲置时的行为,例如使它们等待而不消耗计算资源。
进程池可以提供一个通用的接口,用于执行具有可变数量参数的临时任务,类似于进程对象的目标属性,但不要求我们选择要运行任务的进程、启动进程或等待任务完成。
Python通过 multiprocessing.Pool
类提供了进程池。
multiprocessing.pool.Pool
类在Python中提供了一个进程池。
multiprocessing.pool.Pool
类也可以通过别名 multiprocessing.Pool
访问,它们可以互换使用。
它允许将任务作为函数提交到进程池中并发执行。
要使用进程池,我们首先必须创建并配置该类的一个实例。
例如:
python# 创建一个进程池
pool = multiprocessing.pool.Pool(...)
一旦配置完成,可以使用 apply()
和 map()
的阻塞和异步版本将任务提交给进程池执行。
例如:
python# 发出任务以执行
results = pool.map(task, items)
完成进程池的使用后,可以关闭它并释放进程池使用的资源。
例如:
python# 关闭进程池
pool.close()
现在我们对Python进程池有了一个高层次的理解,让我们看一下 multiprocessing.pool.Pool
类的生命周期。
本文作者:Eric
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!