终止角色#
当所有actor句柄在Python中超出作用域,或者如果原始创建者进程死亡时,actor进程将自动终止。
请注意,Java 或 C++ 中尚不支持演员的自动终止。
通过actor句柄手动终止#
在大多数情况下,Ray 会自动终止超出作用域的执行体,但有时你可能需要强制终止一个执行体。这应该保留在执行体意外挂起或泄露资源的情况下使用,以及对于必须手动销毁的 分离执行体 。
import ray
@ray.remote
class Actor:
pass
actor_handle = Actor.remote()
ray.kill(actor_handle)
# This will not go through the normal Python sys.exit
# teardown logic, so any exit handlers installed in
# the actor using ``atexit`` will not be called.
actorHandle.kill();
// This will not go through the normal Java System.exit teardown logic, so any
// shutdown hooks installed in the actor using ``Runtime.addShutdownHook(...)`` will
// not be called.
actor_handle.Kill();
// This will not go through the normal C++ std::exit
// teardown logic, so any exit handlers installed in
// the actor using ``std::atexit`` will not be called.
这将导致该actor立即退出其进程,导致任何当前、待处理和未来的任务因 RayActorError
而失败。如果你希望Ray 自动重启 该actor,请确保在actor的 @ray.remote
选项中设置一个非零的 max_restarts
,然后将 no_restart=False
标志传递给 ray.kill
。
对于 命名和分离的执行者,在执行者句柄上调用 ray.kill
会销毁执行者并允许该名称被重新使用。
使用 State API 中的 ray list actors --detail
查看已死亡角色的死亡原因:
# This API is only available when you download Ray via `pip install "ray[default]"`
ray list actors --detail
---
- actor_id: e8702085880657b355bf7ef001000000
class_name: Actor
state: DEAD
job_id: '01000000'
name: ''
node_id: null
pid: 0
ray_namespace: dbab546b-7ce5-4cbb-96f1-d0f64588ae60
serialized_runtime_env: '{}'
required_resources: {}
death_cause:
actor_died_error_context: # <---- You could see the error message w.r.t why the actor exits.
error_message: The actor is dead because `ray.kill` killed it.
owner_id: 01000000ffffffffffffffffffffffffffffffffffffffffffffffff
owner_ip_address: 127.0.0.1
ray_namespace: dbab546b-7ce5-4cbb-96f1-d0f64588ae60
class_name: Actor
actor_id: e8702085880657b355bf7ef001000000
never_started: true
node_ip_address: ''
pid: 0
name: ''
is_detached: false
placement_group_id: null
repr_name: ''
在actor中的手动终止#
如有必要,您可以从其中一个actor方法中手动终止一个actor。这将终止actor进程并释放与该actor相关联/分配的资源。
@ray.remote
class Actor:
def exit(self):
ray.actor.exit_actor()
actor = Actor.remote()
actor.exit.remote()
通常情况下,这种方法是不必要的,因为角色会自动进行垃圾回收。任务产生的 ObjectRef
可以被等待,以等待角色退出(在其上调用 ray.get()
会引发 RayActorError
)。
Ray.exitActor();
尚未实现角色的垃圾回收,因此目前这是终止角色的唯一优雅方式。任务产生的 ObjectRef
可以被等待,以等待角色退出(在其上调用 ObjectRef::get
将抛出 RayActorException
)。
ray::ExitActor();
尚未实现角色的垃圾回收,因此目前这是终止角色的唯一优雅方式。任务产生的 ObjectRef
可以被等待,以等待角色退出(在其上调用 ObjectRef::Get
将抛出 RayActorException
)。
请注意,这种终止方法会等待所有先前提交的任务执行完毕,然后使用 sys.exit 优雅地退出进程。
你可以看到演员因用户的 exit_actor()
调用而死亡:
# This API is only available when you download Ray via `pip install "ray[default]"`
ray list actors --detail
---
- actor_id: 070eb5f0c9194b851bb1cf1602000000
class_name: Actor
state: DEAD
job_id: '02000000'
name: ''
node_id: 47ccba54e3ea71bac244c015d680e202f187fbbd2f60066174a11ced
pid: 47978
ray_namespace: 18898403-dda0-485a-9c11-e9f94dffcbed
serialized_runtime_env: '{}'
required_resources: {}
death_cause:
actor_died_error_context:
error_message: 'The actor is dead because its worker process has died.
Worker exit type: INTENDED_USER_EXIT Worker exit detail: Worker exits
by an user request. exit_actor() is called.'
owner_id: 02000000ffffffffffffffffffffffffffffffffffffffffffffffff
owner_ip_address: 127.0.0.1
node_ip_address: 127.0.0.1
pid: 47978
ray_namespace: 18898403-dda0-485a-9c11-e9f94dffcbed
class_name: Actor
actor_id: 070eb5f0c9194b851bb1cf1602000000
name: ''
never_started: false
is_detached: false
placement_group_id: null
repr_name: ''