Skip to content

Commit beac40f

Browse files
g97iulio1609Copilot
andcommitted
perf: use deque for InMemoryTaskMessageQueue FIFO operations
Replace list with collections.deque in InMemoryTaskMessageQueue so that dequeue (popleft) runs in O(1) amortised time instead of the O(n) incurred by list.pop(0), which must shift every remaining element on each call. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 62575ed commit beac40f

1 file changed

Lines changed: 5 additions & 4 deletions

File tree

src/mcp/shared/experimental/tasks/message_queue.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"""
1313

1414
from abc import ABC, abstractmethod
15+
from collections import deque
1516
from dataclasses import dataclass, field
1617
from datetime import datetime, timezone
1718
from typing import Any, Literal
@@ -151,13 +152,13 @@ class InMemoryTaskMessageQueue(TaskMessageQueue):
151152
"""
152153

153154
def __init__(self) -> None:
154-
self._queues: dict[str, list[QueuedMessage]] = {}
155+
self._queues: dict[str, deque[QueuedMessage]] = {}
155156
self._events: dict[str, anyio.Event] = {}
156157

157-
def _get_queue(self, task_id: str) -> list[QueuedMessage]:
158+
def _get_queue(self, task_id: str) -> deque[QueuedMessage]:
158159
"""Get or create the queue for a task."""
159160
if task_id not in self._queues:
160-
self._queues[task_id] = []
161+
self._queues[task_id] = deque()
161162
return self._queues[task_id]
162163

163164
async def enqueue(self, task_id: str, message: QueuedMessage) -> None:
@@ -172,7 +173,7 @@ async def dequeue(self, task_id: str) -> QueuedMessage | None:
172173
queue = self._get_queue(task_id)
173174
if not queue:
174175
return None
175-
return queue.pop(0)
176+
return queue.popleft()
176177

177178
async def peek(self, task_id: str) -> QueuedMessage | None:
178179
"""Return the next message without removing it."""

0 commit comments

Comments
 (0)