From a8286ced6bb7c0674877823f5236d356f2ef477d Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Thu, 7 Mar 2024 19:03:27 -0800 Subject: [PATCH 1/3] Concurrent rendering naming fixes --- docs/source/about/changelog.rst | 2 +- src/py/reactpy/reactpy/config.py | 4 ++-- src/py/reactpy/reactpy/core/layout.py | 6 +++--- src/py/reactpy/tests/test_core/test_layout.py | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/source/about/changelog.rst b/docs/source/about/changelog.rst index b2297c20c..48a229eee 100644 --- a/docs/source/about/changelog.rst +++ b/docs/source/about/changelog.rst @@ -26,7 +26,7 @@ Unreleased **Added** -- :pull:`1165` - Allow concurrent renders of discrete component tree - enable this +- :pull:`1165` - Allow asynchronously rendering discrete component tree - enable this experimental feature by setting `REACTPY_ASYNC_RENDERING=true`. This should improve the overall responsiveness of your app, particularly when handling larger renders that would otherwise block faster renders from being processed. diff --git a/src/py/reactpy/reactpy/config.py b/src/py/reactpy/reactpy/config.py index 8ea6aed03..d08cdc218 100644 --- a/src/py/reactpy/reactpy/config.py +++ b/src/py/reactpy/reactpy/config.py @@ -82,9 +82,9 @@ def boolean(value: str | bool | int) -> bool: """A default timeout for testing utilities in ReactPy""" REACTPY_ASYNC_RENDERING = Option( - "REACTPY_CONCURRENT_RENDERING", + "REACTPY_ASYNC_RENDERING", default=False, mutable=True, validator=boolean, ) -"""Whether to render components concurrently. This is currently an experimental feature.""" +"""Whether to render components asynchronously. This is currently an experimental feature.""" diff --git a/src/py/reactpy/reactpy/core/layout.py b/src/py/reactpy/reactpy/core/layout.py index 70bdbbbff..5cb1409d7 100644 --- a/src/py/reactpy/reactpy/core/layout.py +++ b/src/py/reactpy/reactpy/core/layout.py @@ -129,7 +129,7 @@ async def deliver(self, event: LayoutEventMessage) -> None: async def render(self) -> LayoutUpdateMessage: if REACTPY_ASYNC_RENDERING.current: - return await self._concurrent_render() + return await self._parallel_render() else: # nocov return await self._serial_render() @@ -147,8 +147,8 @@ async def _serial_render(self) -> LayoutUpdateMessage: # nocov else: return await self._create_layout_update(model_state) - async def _concurrent_render(self) -> LayoutUpdateMessage: - """Await the next available render. This will block until a component is updated""" + async def _parallel_render(self) -> LayoutUpdateMessage: + """Await the next available render within an asyncio task group.""" await self._render_tasks_ready.acquire() done, _ = await wait(self._render_tasks, return_when=FIRST_COMPLETED) update_task: Task[LayoutUpdateMessage] = done.pop() diff --git a/src/py/reactpy/tests/test_core/test_layout.py b/src/py/reactpy/tests/test_core/test_layout.py index cfb544758..f93ffeb3d 100644 --- a/src/py/reactpy/tests/test_core/test_layout.py +++ b/src/py/reactpy/tests/test_core/test_layout.py @@ -32,7 +32,7 @@ @pytest.fixture(autouse=True, params=[True, False]) -def concurrent_rendering(request): +def async_rendering(request): with patch.object(REACTPY_ASYNC_RENDERING, "current", request.param): yield request.param @@ -1252,9 +1252,9 @@ def App(): assert c["attributes"]["color"] == "blue" -async def test_concurrent_renders(concurrent_rendering): - if not concurrent_rendering: - raise pytest.skip("Concurrent rendering not enabled") +async def test_async_renders(async_rendering): + if not async_rendering: + raise pytest.skip("Async rendering not enabled") child_1_hook = HookCatcher() child_2_hook = HookCatcher() From e1473cae266f6f5cb4e7deca2a35609b676f0bda Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Thu, 7 Mar 2024 19:12:18 -0800 Subject: [PATCH 2/3] update docstring --- src/py/reactpy/reactpy/core/layout.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/py/reactpy/reactpy/core/layout.py b/src/py/reactpy/reactpy/core/layout.py index 5cb1409d7..f45becf7a 100644 --- a/src/py/reactpy/reactpy/core/layout.py +++ b/src/py/reactpy/reactpy/core/layout.py @@ -148,7 +148,9 @@ async def _serial_render(self) -> LayoutUpdateMessage: # nocov return await self._create_layout_update(model_state) async def _parallel_render(self) -> LayoutUpdateMessage: - """Await the next available render within an asyncio task group.""" + """Await to fetch the first completed render within our asyncio task group. + We use the `asyncio.tasks.wait` API in order to return the first completed task. + """ await self._render_tasks_ready.acquire() done, _ = await wait(self._render_tasks, return_when=FIRST_COMPLETED) update_task: Task[LayoutUpdateMessage] = done.pop() From 7188bdd5f3fb2491b8cacb6c185512fe535e9112 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Thu, 7 Mar 2024 19:14:37 -0800 Subject: [PATCH 3/3] Clean up changelog verbiage --- docs/source/about/changelog.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/about/changelog.rst b/docs/source/about/changelog.rst index 48a229eee..9fc13e015 100644 --- a/docs/source/about/changelog.rst +++ b/docs/source/about/changelog.rst @@ -26,10 +26,10 @@ Unreleased **Added** -- :pull:`1165` - Allow asynchronously rendering discrete component tree - enable this - experimental feature by setting `REACTPY_ASYNC_RENDERING=true`. This should improve - the overall responsiveness of your app, particularly when handling larger renders - that would otherwise block faster renders from being processed. +- :pull:`1165` - Allow concurrently rendering discrete component trees - enable this + experimental feature by setting `REACTPY_ASYNC_RENDERING=true`. This improves + the overall responsiveness of your app in situations where larger renders would + otherwise block smaller renders from executing. **Changed**