使用多个处理器¶
本教程的这一部分展示了在DEAP中分发操作所需的所有工作。分发依赖于对象的序列化,这通常通过pickling来完成,因此所有分发的对象(例如函数和参数,个体和参数)必须是可pickle的。这意味着在远程处理单元上对对象所做的修改如果没有通过函数参数和返回值显式通信,将不会对其他处理单元(包括主处理单元)可用。
Python中的可扩展并发操作(SCOOP)¶
SCOOP 是一个分布式任务模块,允许在各种环境中进行并发并行编程,从异构网格到超级计算机。它有一个类似于 Python 3.2 中引入的 concurrent.futures
模块的接口。它的两个简单函数 submit()
和 map()
允许在计算机网格上高效且轻松地分配计算。
在 第二部分 中,一个完整的算法被展示出来,其中 toolbox.map()
保持为默认的 map()
。为了分发评估,我们将用SCOOP中的map替换这个map。:
from scoop import futures
toolbox.register("map", futures.map)
一旦添加了这一行,您的程序绝对需要从 main()
函数运行,如 scoop 文档 中所述。要运行您的程序,请将 scoop 作为主模块使用。
$ python -m scoop your_program.py
就是这样,你的程序已经在你的计算机上所有可用的处理器上并行运行了。
多进程模块¶
使用 multiprocessing
模块类似于使用 SCOOP。可以通过将工具箱中的相应函数替换为分布式函数来实现。:
import multiprocessing
pool = multiprocessing.Pool()
toolbox.register("map", pool.map)
# Continue on with the evolutionary algorithm
警告
如 multiprocessing
指南中所述,在Windows下,由于进程初始化的方式,进程池必须在 if __name__ == "__main__"
部分中进行保护。
备注
虽然多进程模块需要 Python 2.6,但部分函数的序列化仅从 Python 2.7(或 3.1)开始才可能。在较早版本的 Python 中,在使用多进程 multiprocessing.Pool.map()
时使用部分函数可能会抛出一些奇怪的错误。这可以通过在工具箱外部创建本地函数(在 Python 2.6 版本中)来避免。
备注
Python 中尚未提供 lambda 函数的序列化功能。