
本文详解如何在 browser-use 框架中真正并行执行多个浏览器代理(Agent),关键在于共享单个 Browser 实例、为每个 Agent 分配独立 BrowserContext,并通过 asyncio.gather 并发调度——而非创建多个进程或重复启动浏览器。
本文详解如何在 `browser-use` 框架中真正并行执行多个浏览器代理(agent),关键在于共享单个 `browser` 实例、为每个 agent 分配独立 `browsercontext`,并通过 `asyncio.gather` 并发调度——而非创建多个进程或重复启动浏览器。
在 browser-use 中实现真正的并行,核心误区在于“为每个 Agent 启动独立浏览器进程”。这不仅资源开销巨大、易触发端口冲突或 Chromium 实例竞争,还违背了异步并发的设计哲学。正确做法是:复用一个 Browser 实例,但为每个 Agent 创建隔离的 BrowserContext(即无痕会话级沙箱)。每个上下文拥有独立的 Cookie、缓存、本地存储和页面实例,彼此完全隔离,却共享底层 Chromium 浏览器进程,从而兼顾并发性与资源效率。
以下是一个生产就绪的并行 Agent 示例:
import asyncio
import os
from langchain_openai import ChatOpenAI
from browser_use.agent.service import Agent
from browser_use.browser.browser import Browser, BrowserConfig
from browser_use.browser.context import BrowserContextConfig
# ✅ 全局唯一 Browser 实例(复用 Chromium 进程)
browser = Browser(
config=BrowserConfig(
headless=False, # 设为 True 可提升性能(推荐生产环境)
disable_security=True,
new_context_config=BrowserContextConfig(
save_recording_path='./tmp/recordings', # 可选:录制操作视频
),
)
)
llm = ChatOpenAI(
model='gpt-4o',
api_key=os.getenv('OPENAI_API_KEY'), # 务必通过环境变量管理密钥
)
async def main():
# ✅ 为每个任务创建独立 Agent,自动分配新 BrowserContext
agents = [
Agent(task="搜索东京天气预报", llm=llm, browser=browser),
Agent(task="查看 Reddit 首页标题", llm=llm, browser=browser),
Agent(task="查询 Coinbase 上比特币实时价格", llm=llm, browser=browser),
Agent(task="获取 NASA 今日天文图片", llm=llm, browser=browser),
]
# ✅ 真正异步并发:所有 Agent 的 run() 协程同时调度
await asyncio.gather(*[agent.run() for agent in agents])
# ✅ 统一清理:关闭整个浏览器(所有上下文自动销毁)
await browser.close()
if __name__ == '__main__':
asyncio.run(main())⚠️ 关键注意事项:
-
不要手动传入
browser_context参数:browser-usev0.4+ 已自动为每个Agent创建专属BrowserContext;显式传入(如原代码中的context1/context2)反而可能破坏上下文隔离或引发竞态。 -
避免
ProcessPoolExecutor:Browser和Agent均为协程友好型设计,强行混用多进程会破坏事件循环、导致RuntimeError: There is no current event loop或浏览器句柄泄漏。 -
资源监控建议:并行 Agent 数量建议 ≤ 5(取决于内存)。过多上下文可能导致 Chromium OOM;可通过
BrowserConfig.max_contexts限制(需框架支持)或添加asyncio.Semaphore控制并发度。 -
错误隔离:任一 Agent 报错不会中断其他 Agent 执行(
asyncio.gather(..., return_exceptions=True)可捕获各任务异常)。
总结而言,并行 ≠ 多进程,而是高效复用 + 逻辑隔离。通过 Browser 单例 + BrowserContext 多实例 + asyncio.gather 调度,你能在毫秒级启动数十个隔离浏览器会话,实现高吞吐、低开销的自动化浏览器协同任务。


















