From 5a4f6956b377f510895b5cb2a9382034291cdec2 Mon Sep 17 00:00:00 2001 From: Greyson Lalonde Date: Fri, 13 Mar 2026 00:44:34 -0400 Subject: [PATCH] fix: avoid blocking event loop in async browser session wait --- .../bedrock/browser/browser_session_manager.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/crewai-tools/src/crewai_tools/aws/bedrock/browser/browser_session_manager.py b/lib/crewai-tools/src/crewai_tools/aws/bedrock/browser/browser_session_manager.py index 697506cb4..257074284 100644 --- a/lib/crewai-tools/src/crewai_tools/aws/bedrock/browser/browser_session_manager.py +++ b/lib/crewai-tools/src/crewai_tools/aws/bedrock/browser/browser_session_manager.py @@ -1,5 +1,7 @@ from __future__ import annotations +import asyncio +import contextvars import logging import threading from typing import TYPE_CHECKING @@ -45,6 +47,7 @@ class BrowserSessionManager: Returns: An async browser instance specific to the thread """ + loop = asyncio.get_event_loop() while True: with self._lock: if thread_id in self._async_sessions: @@ -53,7 +56,8 @@ class BrowserSessionManager: self._creating[thread_id] = threading.Event() break event = self._creating[thread_id] - event.wait() + ctx = contextvars.copy_context() + await loop.run_in_executor(None, ctx.run, event.wait) try: browser_client, browser = await self._create_async_browser_session( @@ -64,9 +68,8 @@ class BrowserSessionManager: return browser finally: with self._lock: - event = self._creating.pop(thread_id, None) - if event is not None: - event.set() + evt = self._creating.pop(thread_id) + evt.set() def get_sync_browser(self, thread_id: str) -> SyncBrowser: """Get or create a sync browser for the specified thread. @@ -91,9 +94,8 @@ class BrowserSessionManager: return self._create_sync_browser_session(thread_id) finally: with self._lock: - event = self._creating.pop(thread_id, None) - if event is not None: - event.set() + evt = self._creating.pop(thread_id) + evt.set() async def _create_async_browser_session( self, thread_id: str