# flake8: noqa # fmt: off # __example_deployment_start__ import time from ray import serve from starlette.requests import Request @serve.deployment( # Each replica will be sent 2 requests at a time. max_ongoing_requests=2, # Each caller queues up to 2 requests at a time. # (beyond those that are sent to replicas). max_queued_requests=2, ) class SlowDeployment: def __call__(self, request: Request) -> str: # Emulate a long-running request, such as ML inference. time.sleep(2) return "Hello!" # __example_deployment_end__ # __client_test_start__ import ray import aiohttp @ray.remote class Requester: async def do_request(self) -> int: async with aiohttp.ClientSession("http://localhost:8000/") as session: return (await session.get("/")).status r = Requester.remote() serve.run(SlowDeployment.bind()) # Send 4 requests first. # 2 of these will be sent to the replica. These requests take a few seconds to execute. first_refs = [r.do_request.remote() for _ in range(2)] _, pending = ray.wait(first_refs, timeout=1) assert len(pending) == 2 # 2 will be queued in the proxy. queued_refs = [r.do_request.remote() for _ in range(2)] _, pending = ray.wait(queued_refs, timeout=0.1) assert len(pending) == 2 # Send an additional 5 requests. These will be rejected immediately because # the replica and the proxy queue are already full. for status_code in ray.get([r.do_request.remote() for _ in range(5)]): assert status_code == 503 # The initial requests will finish successfully. for ref in first_refs: print(f"Request finished with status code {ray.get(ref)}.") # __client_test_end__