From b170c98615df4e64a22d991d5f5afcc0fb0ddc3a Mon Sep 17 00:00:00 2001 From: Greyson Lalonde Date: Mon, 2 Feb 2026 00:15:30 -0500 Subject: [PATCH] fix: replace timing-based concurrency test with deterministic state tracking --- .../tests/agents/test_async_agent_executor.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/crewai/tests/agents/test_async_agent_executor.py b/lib/crewai/tests/agents/test_async_agent_executor.py index bfed955dea..4dc72ab2a9 100644 --- a/lib/crewai/tests/agents/test_async_agent_executor.py +++ b/lib/crewai/tests/agents/test_async_agent_executor.py @@ -235,8 +235,13 @@ async def test_concurrent_ainvoke_calls( mock_crew: MagicMock, mock_tools_handler: MagicMock ) -> None: """Test that multiple ainvoke calls can run concurrently.""" + max_concurrent = 0 + current_concurrent = 0 + lock = asyncio.Lock() async def create_and_run_executor(executor_id: int) -> dict[str, Any]: + nonlocal max_concurrent, current_concurrent + executor = CrewAgentExecutor( llm=mock_llm, task=mock_task, @@ -252,7 +257,13 @@ async def create_and_run_executor(executor_id: int) -> dict[str, Any]: ) async def delayed_response(*args: Any, **kwargs: Any) -> str: - await asyncio.sleep(0.05) + nonlocal max_concurrent, current_concurrent + async with lock: + current_concurrent += 1 + max_concurrent = max(max_concurrent, current_concurrent) + await asyncio.sleep(0.01) + async with lock: + current_concurrent -= 1 return f"Thought: Done\nFinal Answer: Result from executor {executor_id}" with patch( @@ -273,19 +284,15 @@ async def delayed_response(*args: Any, **kwargs: Any) -> str: } ) - import time - - start = time.time() results = await asyncio.gather( create_and_run_executor(1), create_and_run_executor(2), create_and_run_executor(3), ) - elapsed = time.time() - start assert len(results) == 3 assert all("output" in r for r in results) - assert elapsed < 0.15, f"Expected concurrent execution, took {elapsed}s" + assert max_concurrent > 1, f"Expected concurrent execution, max concurrent was {max_concurrent}" class TestAsyncLLMResponseHelper: