Files
ray-project--ray/python/ray/tests/test_actor_group.py
T
2026-07-13 13:17:40 +08:00

110 lines
2.9 KiB
Python

import sys
import time
import warnings
import pytest
import ray
from ray.util.actor_group import ActorGroup
from ray.util.state import list_actors
class DummyActor:
def return_arg(self, arg):
return arg
def get_actor_metadata(self):
return "metadata"
# Use default filterwarnings behavior for this test
@pytest.mark.filterwarnings("default")
def test_actor_creation(ray_start_2_cpus):
assert ray.available_resources()["CPU"] == 2
with warnings.catch_warnings(record=True) as w:
ag = ActorGroup(actor_cls=DummyActor, num_actors=2)
assert any(
"use ray.util.multiprocessing" in str(warning.message) for warning in w
)
assert len(ag) == 2
time.sleep(1)
# Make sure both CPUs are being used by the actors.
assert "CPU" not in ray.available_resources()
ag.shutdown()
def test_actor_creation_num_cpus(ray_start_2_cpus):
assert ray.available_resources()["CPU"] == 2
ag = ActorGroup(actor_cls=DummyActor, num_cpus_per_actor=2)
time.sleep(1)
assert len(ag) == 1
# Make sure both CPUs are being used by the actor.
assert "CPU" not in ray.available_resources()
ag.shutdown()
@pytest.mark.parametrize(
"ray_start_2_cpus",
[{"include_dashboard": True}],
indirect=True,
)
def test_actor_shutdown(ray_start_2_cpus):
assert ray.available_resources()["CPU"] == 2
ag = ActorGroup(actor_cls=DummyActor, num_actors=2)
time.sleep(1)
assert "CPU" not in ray.available_resources()
assert len(list_actors()) == 2
ag.shutdown()
time.sleep(1)
assert ray.available_resources()["CPU"] == 2
with pytest.raises(RuntimeError):
ag.return_arg.remote(1)
def test_actor_restart(ray_start_2_cpus):
ag = ActorGroup(actor_cls=DummyActor, num_actors=2)
with pytest.raises(RuntimeError):
ag.start()
# Avoid race condition.
time.sleep(1)
ag.shutdown(0)
ag.start()
ray.get(ag.return_arg.remote(1))
def test_actor_method(ray_start_2_cpus):
ag = ActorGroup(actor_cls=DummyActor, num_actors=2)
assert ray.get(ag.return_arg.remote(1)) == [1, 1]
def test_actor_metadata(ray_start_2_cpus):
ag = ActorGroup(actor_cls=DummyActor, num_actors=2)
assert ag.actor_metadata == ["metadata", "metadata"]
def test_actor_method_fail(ray_start_2_cpus):
ag = ActorGroup(actor_cls=DummyActor, num_actors=2)
with pytest.raises(TypeError):
ag.return_arg(1)
with pytest.raises(AttributeError):
ag.non_existent_method.remote()
def test_bad_resources(ray_start_2_cpus):
with pytest.raises(ValueError):
ActorGroup(actor_cls=DummyActor, num_actors=-1)
with pytest.raises(ValueError):
ActorGroup(actor_cls=DummyActor, num_actors=-1)
with pytest.raises(ValueError):
ActorGroup(actor_cls=DummyActor, num_actors=-1)
if __name__ == "__main__":
sys.exit(pytest.main(["-sv", __file__]))