并发是一种非严格求值形式,即无法预知操作的实际顺序。multiprocessing
包引入了Pool
对象的概念。一个Pool
对象包含许多工作进程,且这些进程能并发执行。这个包允许操作系统调度和时间分片交错地执行多个进程,旨在使整个系统尽可能地满负荷运作。
为了充分利用这种功能,需要将应用程序分解为支持非严格执行的组件。整个应用程序必须由能以非确定顺序处理的离散任务来构建。
例如,一个通过网页抓取从互联网收集数据的应用通常可以通过并行处理实现优化。我们可以创建一个具有多个同等worker的Pool
对象来进行网站抓取。URL形式的任务分配给每个worker供其分析。
分析多个日志文件的应用也能实现并行化。可以创建一个包含分析worker的Pool
对象,将每个日志文件分配给一个分析worker,这就使得Pool
对象中各个worker能并行地进行读取和分析。每个worker都会执行I/O和计算,但一个worker可以在其他worker等待I/O完成的同时执行分析。
由于性能获益取决于时间难以预测的输入和输出操作,因此往往需要对多进程进行大量试验。改变工作池的大小和测量运行时间是设计并发应用程序的重要部分。