岛屿列表#

用Python实现的岛屿#

class pygmo.mp_island(use_pool=True)#

多进程岛屿。

版本2.10中的新功能:use_pool参数(在之前的版本中,mp_island始终使用进程池)。

这个用户定义的岛屿(UDI)将使用标准Python multiprocessing模块提供的功能,将进化任务分派给外部Python进程。

If the construction argument use_pool is True, then a process from a global pool shared between different instances of mp_island will be used. The pool is created either implicitly by the construction of the first mp_island object or explicitly via the init_pool() static method. The default number of processes in the pool is equal to the number of logical CPUs on the current machine. The pool’s size can be queried via get_pool_size(), and changed via resize_pool(). The pool can be stopped via shutdown_pool().

如果use_poolFalse,由mp_island启动的每个进化将被卸载到一个新的process,该进程将在进化结束时终止。

一般来说,进程池会比为每次进化生成一个新进程更快(并且会使用更少的资源)。然而,进程池本质上限制了可以在系统上同时运行的进化数量,并且它引入了一种串行化行为,在某些情况下可能并不理想(例如,在研究archipelago中的迁移并行进化时)。

注意

由于CPython的某些实现细节,无法从与主线程不同的线程初始化、调整大小或关闭池。通常这不是问题,但是,例如,如果第一个mp_island实例在与主线程不同的线程中创建,将会引发错误。在这种情况下,用户应确保在生成辅助线程之前从主线程调用init_pool()

警告

由于CPython的内部限制,在mp_island演化过程中发送中断信号(例如,在交互式Python会话中按下Ctrl+C)可能会导致中断信号也被发送到外部演化进程。这可能导致不可预测的运行时行为(例如,会话可能会挂起)。尽管pygmo尽力尽可能减少这种情况的发生,但它无法完全消除。因此,建议用户在使用mp_island时,特别是在交互式会话中,谨慎处理中断信号。

警告

由于一个上游错误,当使用Python 3.8时,多进程机制可能会导致Python会话退出时挂起。作为在错误解决之前的临时解决方案,建议用户在退出Python会话之前显式调用shutdown_pool()

Parameters

use_pool (bool) – 如果为True,将使用全局池中的一个进程来运行进化,否则将为每次进化生成一个新进程

Raises
get_extra_info()#

岛屿的额外信息。

如果该岛使用进程池并且池之前通过shutdown_pool()关闭,调用此函数将触发新池的创建。

Returns

一个包含有关岛屿状态信息的字符串(例如,池中的进程数量、进化进程的ID等)

Return type

str

Raises

未指定 – 由get_pool_size()抛出的任何异常

get_name()#

岛屿的名称。

Returns

"多进程 岛屿"

Return type

str

static get_pool_size()#

获取进程池的大小。

如果进程池之前通过shutdown_pool()关闭,调用此函数将触发创建一个新的池。

Returns

当前池的大小

Return type

int

Raises

未指定 – 由init_pool()抛出的任何异常

static init_pool(processes=None)#

初始化进程池。

如果池尚未初始化或之前通过shutdown_pool()关闭了池,则此方法将初始化支持mp_island的进程池。否则,此方法将无效。

Parameters

processes (Noneint) – 池的大小(如果为 None,池的大小将等于系统上的逻辑CPU数量)

Raises
  • ValueError – 如果池尚不存在且函数是从不同于主线程的线程调用的,或者如果processes是非正值

  • TypeError – 如果 processes 不是 None 并且不是 int

property pid#

进化过程的ID(只读)。

此属性仅在岛屿使用进程池时可用。

Returns

运行当前进度的进程ID,如果没有进行中的进度则为None

Return type

int

Raises

ValueError – 如果岛屿正在使用进程池

static resize_pool(processes)#

调整池大小。

此方法将调整支持mp_island的进程池的大小。

如果进程池之前通过shutdown_pool()关闭,调用此函数将触发创建一个新的池。

Parameters

processes (int) – 池中所需的进程数量

Raises
run_evolve(algo, pop)#

进化种群。

此方法将使用输入的algorithm algo来进化输入的population pop,并返回algo和进化后的种群。进化过程将在支持mp_island的池中的一个进程上运行,或者在一个新的独立进程中运行。如果此岛正在使用池,并且池之前通过shutdown_pool()关闭,则会引发异常。

Parameters
Returns

一个包含2个元素的元组,其中包含algo(即用于进化的algorithm对象)和进化后的population

Return type

tuple

Raises
  • 运行时错误 – 如果池通过 shutdown_pool() 手动关闭

  • 未指定 – 由进化、输入参数或返回值的(反)序列化,或进程池的公共接口抛出的任何异常

static shutdown_pool()#

关闭池。

版本2.8中的新功能。

此方法将在池中所有待处理任务完成后关闭支持mp_island的进程池。

进程池关闭后,尝试在岛上运行进化将引发错误。可以通过显式调用init_pool()mp_island公共API的方法之一来创建新的进程池,这些方法会触发新进程池的创建。

property use_pool#

池使用标志(只读)。

Returns

True 如果此岛屿使用进程池,False 否则

Return type

bool

class pygmo.ipyparallel_island#

Ipyparallel 岛屿。

这个用户定义的岛屿(UDI)将把进化任务分派给一个ipyparallel集群。与集群的通信是通过一个ipyparallel.LoadBalancedView实例来管理的,该实例在第一次运行进化时隐式创建,或者通过init_view()方法显式创建。LoadBalancedView实例是一个在所有ipyparallel岛屿之间共享的全局对象。

get_extra_info()#

岛屿的额外信息。

Returns

一个包含有关岛屿状态额外信息的字符串

Return type

str

get_name()#

岛屿的名称。

Returns

"Ipyparallel island"

Return type

str

static init_view(client_args=[], client_kwargs={}, view_args=[], view_kwargs={})#

初始化 ipyparallel 视图。

版本2.12中的新功能。

此方法将初始化ipyparallel.LoadBalancedView,所有ipyparallel岛屿都使用它来将进化任务提交到ipyparallel集群。如果ipyparallel.LoadBalancedView已经创建,则此方法将不执行任何操作。

输入参数 client_argsclient_kwargs 作为位置参数和关键字参数传递给 ipyparallel.Client 实例的构造。从构造的客户端中,通过 ipyparallel.Client.load_balanced_view() 方法创建一个 ipyparallel.LoadBalancedView 实例,并将位置参数和关键字参数 view_argsview_kwargs 传递给它。

请注意,通常不需要显式调用此方法:当第一次将进化任务提交到ipyparallel岛时,会自动使用默认设置构造一个ipyparallel.LoadBalancedView。只有在需要向ipyparallel.Clientipyparallel.LoadBalancedView对象的构造传递自定义参数时,才应使用此方法。

Parameters
  • client_args (list) – 用于客户端构建的位置参数

  • client_kwargs (dict) – 用于客户端构造的关键字参数

  • view_args (list) – 用于视图构造的位置参数

  • view_kwargs (dict) – 用于视图构造的关键字参数

Raises

未指定 – 由ipyparallel.Client的构造函数或ipyparallel.Client.load_balanced_view()方法抛出的任何异常

run_evolve(algo, pop)#

进化种群。

此方法将使用输入的algorithm algo来进化输入的population pop,并返回algo和进化后的种群。进化任务通过全局的ipyparallel.LoadBalancedView实例提交到ipyparallel集群,该实例要么在首次调用此方法时隐式初始化,要么通过显式调用init_view()方法来初始化。

Parameters
Returns

一个包含2个元素的元组,其中包含algo(即用于进化的algorithm对象)和进化后的population

Return type

tuple

Raises

未指定 – 由进化、创建ipyparallel.LoadBalancedView或向ipyparallel集群提交进化任务时抛出的任何异常

static shutdown_view()#

销毁 ipyparallel 视图。

版本2.12中的新功能。

此方法将销毁当前由ipyparallel岛屿用于向ipyparallel集群提交进化任务的ipyparallel.LoadBalancedView。可以通过提交新的进化任务或调用init_view()方法隐式重新初始化视图。

从C++暴露的岛屿#

class pygmo.thread_island(use_pool=True)#

线程岛。

这个类是一个用户定义的岛屿(UDI),它将在单独的执行线程中运行进化。在这个UDI上运行的进化任务必须涉及algorithmproblem实例,这些实例至少提供basic thread_safety保证,否则在进化过程中会引发错误。

请注意,用Python实现的算法和问题从不被认为是线程安全的,因此这个UDI只能与用C++实现的算法和问题一起使用。

use_pool 标志表示此岛屿是否应使用由所有岛屿共享的公共线程池。

使用线程池在计算上更高效,至少有两个原因:

  • 当同时进化的岛屿数量大于CPU数量时(例如,在一个大型的archipelago中),它可以避免运行时开销;

  • 因为实现使用了Intel TBB库,所以它能更好地与建立在TBB之上的其他pagmo设施集成(例如,thread_bfe批量适应度评估器)。

然而,线程池也引入了一种串行化行为,因为实际同时运行的进化数量受限于CPU数量(而在没有线程池的情况下,可以同时激活无限数量的进化,尽管会有性能损失)。

另请参阅相应的C++类文档 pagmo::thread_island

版本2.16.0中的新功能:use_pool标志。

Parameters

use_pool (bool) – 一个布尔标志,指示是否应由岛屿使用线程池