Files
2026-07-13 13:17:40 +08:00

93 lines
2.7 KiB
Python

from typing import List, Optional, Tuple
import ray
def get_self_actor() -> Optional["ray.actor.ActorHandle"]:
"""
Get the current actor handle in this worker.
If this is called in a driver process, it will return None.
"""
try:
return ray.get_runtime_context().current_actor
except RuntimeError:
return None
def split_readers_by_locality(
writer: "ray.actor.ActorHandle",
reader_and_node_list: List[Tuple["ray.actor.ActorHandle", str]],
) -> Tuple[
List[Tuple["ray.actor.ActorHandle", str]], List[Tuple["ray.actor.ActorHandle", str]]
]:
"""Split readers into remote and local readers based on writer.
Args:
writer: The actor handle of the writer
reader_and_node_list: List of (reader, node) tuples
Returns:
Tuple containing:
- List of (reader, node) tuples for remote readers
- List of (reader, node) tuples for local readers
"""
remote_readers = []
local_readers = []
for reader, node in reader_and_node_list:
if reader != writer:
remote_readers.append((reader, node))
else:
local_readers.append((reader, node))
return remote_readers, local_readers
def split_actors_by_node_locality(
node: str,
actor_and_node_list: List[Tuple["ray.actor.ActorHandle", str]],
) -> Tuple[
List[Tuple["ray.actor.ActorHandle", str]], List[Tuple["ray.actor.ActorHandle", str]]
]:
"""Split actors into remote and local actors based on node. The local actors will be
on the same node as the given node. The remote actors will be on a different node.
Args:
node: The node to compare actor locations against.
actor_and_node_list: List of (actor, node) tuples
Returns:
Tuple containing:
- List of (actor, node) tuples for actors on the same node
- List of (actor, node) tuples for actors on a different node
"""
actors_on_same_node = []
actors_on_different_node = []
for actor, actor_node in actor_and_node_list:
if node == actor_node:
actors_on_same_node.append((actor, actor_node))
else:
actors_on_different_node.append((actor, actor_node))
return actors_on_same_node, actors_on_different_node
def get_actor_node(actor: Optional["ray.actor.ActorHandle"]) -> str:
"""Get the node of the actor.
Args:
actor: The actor handle of the actor
Returns:
The node of the actor
"""
if actor is None or actor == ray.get_runtime_context().current_actor:
return ray.get_runtime_context().get_node_id()
else:
return ray.get(
actor.__ray_call__.remote(
lambda self: ray.get_runtime_context().get_node_id()
)
)