Skip to content

Commit 726cd52

Browse files
committed
Add max queue size setting
1 parent 95b823d commit 726cd52

File tree

4 files changed

+18
-5
lines changed

4 files changed

+18
-5
lines changed

src/reactpy/config.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,11 @@ def boolean(value: str | bool | int) -> bool:
130130
validator=str,
131131
)
132132
"""The prefix for all ReactPy routes"""
133+
134+
REACTPY_MAX_QUEUE_SIZE = Option(
135+
"REACTPY_MAX_QUEUE_SIZE",
136+
default=1000,
137+
mutable=True,
138+
validator=int,
139+
)
140+
"""The maximum size for internal queues used by ReactPy"""

src/reactpy/core/layout.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
REACTPY_ASYNC_RENDERING,
3535
REACTPY_CHECK_VDOM_SPEC,
3636
REACTPY_DEBUG,
37+
REACTPY_MAX_QUEUE_SIZE,
3738
)
3839
from reactpy.core._life_cycle_hook import HOOK_STACK, LifeCycleHook
3940
from reactpy.core.vdom import validate_vdom_json
@@ -117,7 +118,8 @@ async def deliver(self, event: LayoutEventMessage | dict[str, Any]) -> None:
117118
target = event["target"]
118119
if target not in self._event_queues:
119120
self._event_queues[target] = cast(
120-
"Queue[LayoutEventMessage | dict[str, Any]]", Queue()
121+
"Queue[LayoutEventMessage | dict[str, Any]]",
122+
Queue(REACTPY_MAX_QUEUE_SIZE.current),
121123
)
122124
self._event_processing_tasks[target] = create_task(
123125
self._process_event_queue(target, self._event_queues[target])
@@ -759,7 +761,7 @@ class _LifeCycleState(NamedTuple):
759761
class _ThreadSafeQueue(Generic[_Type]):
760762
def __init__(self) -> None:
761763
self._loop = get_running_loop()
762-
self._queue: Queue[_Type] = Queue()
764+
self._queue: Queue[_Type] = Queue(REACTPY_MAX_QUEUE_SIZE.current)
763765
self._pending: set[_Type] = set()
764766

765767
def put(self, value: _Type) -> None:

src/reactpy/executors/asgi/middleware.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,9 @@ def __init__(
186186
super().__init__(scope=scope, receive=receive, send=send) # type: ignore
187187
self.scope = scope
188188
self.parent = parent
189-
self.rendering_queue: asyncio.Queue[dict[str, str]] = asyncio.Queue()
189+
self.rendering_queue: asyncio.Queue[dict[str, str]] = asyncio.Queue(
190+
config.REACTPY_MAX_QUEUE_SIZE.current
191+
)
190192
self.dispatcher: asyncio.Task[Any] | None = None
191193

192194
async def __aenter__(self) -> ReactPyWebsocket:

tests/test_core/test_serve.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from jsonpointer import set_pointer
88

99
import reactpy
10+
from reactpy.config import REACTPY_MAX_QUEUE_SIZE
1011
from reactpy.core.hooks import use_effect
1112
from reactpy.core.layout import Layout
1213
from reactpy.core.serve import serve_layout
@@ -130,8 +131,8 @@ def set_did_render():
130131
reactpy.html.button({"onClick": handle_event}),
131132
)
132133

133-
send_queue = asyncio.Queue()
134-
recv_queue = asyncio.Queue()
134+
send_queue = asyncio.Queue(REACTPY_MAX_QUEUE_SIZE.current)
135+
recv_queue = asyncio.Queue(REACTPY_MAX_QUEUE_SIZE.current)
135136

136137
task = asyncio.create_task(
137138
serve_layout(

0 commit comments

Comments
 (0)