岛屿列表#
用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 globalpoolshared between different instances ofmp_islandwill be used. The pool is created either implicitly by the construction of the firstmp_islandobject or explicitly via theinit_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 viaget_pool_size(), and changed viaresize_pool(). The pool can be stopped viashutdown_pool().如果use_pool是
False,由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
- Raises
未指定 – 如果 use_pool 是
True,则由init_pool()抛出的任何异常
- get_extra_info()#
岛屿的额外信息。
如果该岛使用进程池并且池之前通过
shutdown_pool()关闭,调用此函数将触发新池的创建。- Returns
一个包含有关岛屿状态信息的字符串(例如,池中的进程数量、进化进程的ID等)
- Return type
- Raises
未指定 – 由
get_pool_size()抛出的任何异常
- static get_pool_size()#
获取进程池的大小。
如果进程池之前通过
shutdown_pool()关闭,调用此函数将触发创建一个新的池。- Returns
当前池的大小
- Return type
- Raises
未指定 – 由
init_pool()抛出的任何异常
- static init_pool(processes=None)#
初始化进程池。
如果池尚未初始化或之前通过
shutdown_pool()关闭了池,则此方法将初始化支持mp_island的进程池。否则,此方法将无效。
- property pid#
进化过程的ID(只读)。
此属性仅在岛屿未使用进程池时可用。
- Returns
运行当前进度的进程ID,如果没有进行中的进度则为
None- Return type
- Raises
ValueError – 如果岛屿正在使用进程池
- static resize_pool(processes)#
调整池大小。
此方法将调整支持
mp_island的进程池的大小。如果进程池之前通过
shutdown_pool()关闭,调用此函数将触发创建一个新的池。- Parameters
processes (
int) – 池中所需的进程数量- Raises
ValueError – 如果 processes 参数不是严格正数
未指定 – 由
init_pool()抛出的任何异常
- run_evolve(algo, pop)#
进化种群。
此方法将使用输入的
algorithmalgo来进化输入的populationpop,并返回algo和进化后的种群。进化过程将在支持mp_island的池中的一个进程上运行,或者在一个新的独立进程中运行。如果此岛正在使用池,并且池之前通过shutdown_pool()关闭,则会引发异常。- Parameters
algo (
algorithm) – 输入的算法pop (
population) – 输入的人口
- Returns
一个包含2个元素的元组,其中包含algo(即用于进化的
algorithm对象)和进化后的population- Return type
- Raises
运行时错误 – 如果池通过
shutdown_pool()手动关闭未指定 – 由进化、输入参数或返回值的(反)序列化,或进程池的公共接口抛出的任何异常
- static shutdown_pool()#
关闭池。
版本2.8中的新功能。
此方法将在池中所有待处理任务完成后关闭支持
mp_island的进程池。进程池关闭后,尝试在岛上运行进化将引发错误。可以通过显式调用
init_pool()或mp_island公共API的方法之一来创建新的进程池,这些方法会触发新进程池的创建。
- class pygmo.ipyparallel_island#
Ipyparallel 岛屿。
这个用户定义的岛屿(UDI)将把进化任务分派给一个ipyparallel集群。与集群的通信是通过一个
ipyparallel.LoadBalancedView实例来管理的,该实例在第一次运行进化时隐式创建,或者通过init_view()方法显式创建。LoadBalancedView实例是一个在所有ipyparallel岛屿之间共享的全局对象。- static init_view(client_args=[], client_kwargs={}, view_args=[], view_kwargs={})#
初始化 ipyparallel 视图。
版本2.12中的新功能。
此方法将初始化
ipyparallel.LoadBalancedView,所有ipyparallel岛屿都使用它来将进化任务提交到ipyparallel集群。如果ipyparallel.LoadBalancedView已经创建,则此方法将不执行任何操作。输入参数 client_args 和 client_kwargs 作为位置参数和关键字参数传递给
ipyparallel.Client实例的构造。从构造的客户端中,通过ipyparallel.Client.load_balanced_view()方法创建一个ipyparallel.LoadBalancedView实例,并将位置参数和关键字参数 view_args 和 view_kwargs 传递给它。请注意,通常不需要显式调用此方法:当第一次将进化任务提交到ipyparallel岛时,会自动使用默认设置构造一个
ipyparallel.LoadBalancedView。只有在需要向ipyparallel.Client或ipyparallel.LoadBalancedView对象的构造传递自定义参数时,才应使用此方法。- Parameters
- Raises
未指定 – 由
ipyparallel.Client的构造函数或ipyparallel.Client.load_balanced_view()方法抛出的任何异常
- run_evolve(algo, pop)#
进化种群。
此方法将使用输入的
algorithmalgo来进化输入的populationpop,并返回algo和进化后的种群。进化任务通过全局的ipyparallel.LoadBalancedView实例提交到ipyparallel集群,该实例要么在首次调用此方法时隐式初始化,要么通过显式调用init_view()方法来初始化。- Parameters
pop (
population) – 输入的人口algo (
algorithm) – 输入的算法
- Returns
一个包含2个元素的元组,其中包含algo(即用于进化的
algorithm对象)和进化后的population- Return type
- 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上运行的进化任务必须涉及
algorithm和problem实例,这些实例至少提供basicthread_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) – 一个布尔标志,指示是否应由岛屿使用线程池