Async API (Experimental) ======================== Since Python 3.5, it is possible to write concurrent code using the ``async/await`` `syntax `__. This document describes Ray's support for asyncio, which enables integration with popular async frameworks (e.g., aiohttp, aioredis, etc.) for high performance web and prediction serving. Converting Ray objects into asyncio futures ------------------------------------------- Ray object IDs can be converted into asyncio futures with ``ray.experimental.async_api``. .. code-block:: python import asyncio import time import ray from ray.experimental import async_api @ray.remote def f(): time.sleep(1) return {'key1': ['value']} ray.init() future = async_api.as_future(f.remote()) asyncio.get_event_loop().run_until_complete(future) # {'key1': ['value']} .. autofunction:: ray.experimental.async_api.as_future Example Usage ------------- +----------------------------------------+-----------------------------------------------------+ | **Basic Python** | **Distributed with Ray** | +----------------------------------------+-----------------------------------------------------+ | .. code-block:: python | .. code-block:: python | | | | | # Execute f serially. | # Execute f in parallel. | | | | | | | | def f(): | @ray.remote | | time.sleep(1) | def f(): | | return 1 | time.sleep(1) | | | return 1 | | | | | | ray.init() | | results = [f() for i in range(4)] | results = ray.get([f.remote() for i in range(4)]) | +----------------------------------------+-----------------------------------------------------+ | **Async Python** | **Async Ray** | +----------------------------------------+-----------------------------------------------------+ | .. code-block:: python | .. code-block:: python | | | | | # Execute f asynchronously. | # Execute f asynchronously with Ray/asyncio. | | | | | | from ray.experimental import async_api | | | | | | @ray.remote | | async def f(): | def f(): | | await asyncio.sleep(1) | time.sleep(1) | | return 1 | return 1 | | | | | | ray.init() | | loop = asyncio.get_event_loop() | loop = asyncio.get_event_loop() | | tasks = [f() for i in range(4)] | tasks = [async_api.as_future(f.remote()) | | | for i in range(4)] | | results = loop.run_until_complete( | results = loop.run_until_complete( | | asyncio.gather(tasks)) | asyncio.gather(tasks)) | +----------------------------------------+-----------------------------------------------------+ Known Issues ------------ Async API support is experimental, and we are working to improve its performance. Please `let us know `__ any issues you encounter.