212 lines
5.2 KiB
Python
212 lines
5.2 KiB
Python
import sys
|
|
|
|
import pytest
|
|
|
|
import ray
|
|
|
|
|
|
def test_multi_raise_exception_on_non_client(shutdown_only):
|
|
with pytest.raises(
|
|
RuntimeError,
|
|
match=("Do not pass the `allow_multiple` to `ray.init` to fix the issue."),
|
|
):
|
|
ray.init(allow_multiple=True)
|
|
|
|
|
|
@pytest.mark.skipif(
|
|
sys.platform == "win32", reason="PSUtil does not work the same on windows."
|
|
)
|
|
@pytest.mark.parametrize(
|
|
"call_ray_start",
|
|
["ray start --head --ray-client-server-port 25001 --port 0"],
|
|
indirect=True,
|
|
)
|
|
def test_multi_cli_basic(call_ray_start):
|
|
ray.init("ray://localhost:25001")
|
|
cli1 = ray.init("ray://localhost:25001", allow_multiple=True)
|
|
cli2 = ray.init("ray://localhost:25001", allow_multiple=True)
|
|
with cli1:
|
|
a = ray.put(10)
|
|
|
|
with cli2:
|
|
b = ray.put(20)
|
|
|
|
# TODO better error message.
|
|
# Right now, it's EOFError actually
|
|
with pytest.raises(Exception):
|
|
ray.get(a)
|
|
|
|
with pytest.raises(Exception), cli2:
|
|
ray.get(a)
|
|
|
|
with pytest.raises(Exception), cli1:
|
|
ray.get(b)
|
|
|
|
c = ray.put(30)
|
|
|
|
with cli1:
|
|
assert 10 == ray.get(a)
|
|
|
|
with cli2:
|
|
assert 20 == ray.get(b)
|
|
|
|
with pytest.raises(Exception), cli1:
|
|
ray.get(c)
|
|
|
|
with pytest.raises(Exception), cli2:
|
|
ray.get(c)
|
|
|
|
|
|
@pytest.mark.skipif(
|
|
sys.platform == "win32", reason="PSUtil does not work the same on windows."
|
|
)
|
|
@pytest.mark.parametrize(
|
|
"call_ray_start",
|
|
["ray start --head --ray-client-server-port 25001 --port 0"],
|
|
indirect=True,
|
|
)
|
|
def test_multi_cli_init(call_ray_start):
|
|
cli1 = ray.init("ray://localhost:25001", allow_multiple=True) # noqa
|
|
with pytest.raises(
|
|
ValueError,
|
|
match="The client has already connected to the cluster "
|
|
"with allow_multiple=True. Please set allow_multiple=True"
|
|
" to proceed",
|
|
):
|
|
ray.init("ray://localhost:25001")
|
|
cli2 = ray.init("ray://localhost:25001", allow_multiple=True) # noqa
|
|
|
|
cli1.disconnect()
|
|
cli2.disconnect()
|
|
|
|
ray.init("ray://localhost:25001")
|
|
cli1 = ray.init("ray://localhost:25001", allow_multiple=True) # noqa
|
|
|
|
|
|
@pytest.mark.skipif(
|
|
sys.platform == "win32", reason="PSUtil does not work the same on windows."
|
|
)
|
|
@pytest.mark.parametrize(
|
|
"call_ray_start",
|
|
["ray start --head --ray-client-server-port 25001 --port 0"],
|
|
indirect=True,
|
|
)
|
|
def test_multi_cli_func(call_ray_start):
|
|
@ray.remote
|
|
def hello():
|
|
return "world"
|
|
|
|
cli1 = ray.init("ray://localhost:25001", allow_multiple=True)
|
|
cli2 = ray.init("ray://localhost:25001", allow_multiple=True)
|
|
|
|
# TODO better error message.
|
|
# Right now, it's EOFError actually
|
|
with pytest.raises(Exception):
|
|
ray.get(hello.remote())
|
|
|
|
with cli1:
|
|
o1 = hello.remote()
|
|
assert "world" == ray.get(o1)
|
|
|
|
with cli2:
|
|
o2 = hello.remote()
|
|
assert "world" == ray.get(o2)
|
|
|
|
with pytest.raises(Exception), cli1:
|
|
ray.get(o2)
|
|
|
|
with pytest.raises(Exception), cli2:
|
|
ray.get(o1)
|
|
|
|
|
|
@pytest.mark.skipif(
|
|
sys.platform == "win32", reason="PSUtil does not work the same on windows."
|
|
)
|
|
@pytest.mark.parametrize(
|
|
"call_ray_start",
|
|
["ray start --head --ray-client-server-port 25001 --port 0"],
|
|
indirect=True,
|
|
)
|
|
def test_multi_cli_actor(call_ray_start):
|
|
@ray.remote
|
|
class Actor:
|
|
def __init__(self, v):
|
|
self.v = v
|
|
|
|
def double(self):
|
|
return self.v * 2
|
|
|
|
cli1 = ray.init("ray://localhost:25001", allow_multiple=True)
|
|
cli2 = ray.init("ray://localhost:25001", allow_multiple=True)
|
|
|
|
# TODO better error message.
|
|
# Right now, it's EOFError actually
|
|
with pytest.raises(Exception):
|
|
a = Actor.remote(10)
|
|
ray.get(a.double.remote())
|
|
|
|
with cli1:
|
|
a1 = Actor.remote(10)
|
|
o1 = a1.double.remote()
|
|
assert 20 == ray.get(o1)
|
|
|
|
with cli2:
|
|
a2 = Actor.remote(20)
|
|
o2 = a2.double.remote()
|
|
assert 40 == ray.get(o2)
|
|
|
|
with pytest.raises(Exception), cli1:
|
|
ray.get(a2.double.remote())
|
|
|
|
with pytest.raises(Exception), cli1:
|
|
ray.get(o2)
|
|
|
|
with pytest.raises(Exception), cli2:
|
|
ray.get(a1.double.remote())
|
|
|
|
with pytest.raises(Exception), cli2:
|
|
ray.get(o1)
|
|
|
|
|
|
@pytest.mark.skipif(
|
|
sys.platform == "win32", reason="PSUtil does not work the same on windows."
|
|
)
|
|
@pytest.mark.parametrize(
|
|
"call_ray_start",
|
|
["ray start --head --ray-client-server-port 25001 --port 0"],
|
|
indirect=True,
|
|
)
|
|
def test_multi_cli_threading(call_ray_start):
|
|
import threading
|
|
|
|
b = threading.Barrier(2)
|
|
ret = [None, None]
|
|
|
|
def get(idx):
|
|
cli = ray.init("ray://localhost:25001", allow_multiple=True)
|
|
with cli:
|
|
a = ray.put(idx)
|
|
b.wait()
|
|
v = ray.get(a)
|
|
assert idx == v
|
|
b.wait()
|
|
ret[idx] = v
|
|
|
|
t1 = threading.Thread(target=get, args=(0,))
|
|
t2 = threading.Thread(target=get, args=(1,))
|
|
t1.start()
|
|
t2.start()
|
|
t1.join()
|
|
t2.join()
|
|
assert ret == [0, 1]
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# The following should be removed after
|
|
# https://github.com/ray-project/ray/issues/20355
|
|
# is fixed.
|
|
from ray._private import auto_init_hook
|
|
|
|
auto_init_hook.enable_auto_connect = False
|
|
sys.exit(pytest.main(["-sv", __file__]))
|