You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何并行运行多个browser-use agents?

如何并行运行多个browser-use agents?

我明白你的问题——你用asyncio.gather尝试并行运行两个agent,但它们实际上并没有真正并行工作。核心问题有两个:一是你共享了同一个Browser实例,浏览器本身没法同时处理两个独立的任务流;二是asyncio的并发是单线程的,就算代码写了异步,对于浏览器这种依赖外部进程的操作,也没法绕过GIL实现真正的并行执行。

要解决这个问题,最直接的方式是用多进程来运行每个agent,让每个进程拥有独立的浏览器实例、LLM和控制器。这样两个浏览器会真正同时工作,完全不会互相干扰。

具体实现方案

我们可以用Python的multiprocessing.Process来创建独立进程,每个进程负责初始化自己的资源并运行一个agent。这样每个进程都有自己的内存空间和Python解释器,完美避开共享资源的问题。

修改后的代码如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
:brief: Run multiple browser-use agents in parallel using multiprocessing
"""
import os
import asyncio
from multiprocessing import Process
from browser_use import Agent, Browser, BrowserConfig, Controller
from browser_use.browser.context import BrowserContext
from langchain_openai import ChatOpenAI


def run_single_agent(task: str):
    # 每个进程独立初始化所有资源:控制器、LLM、浏览器、上下文
    controller = Controller()
    llm = ChatOpenAI(model="gpt-4o", api_key=os.getenv("OPENAI_API_KEY"))
    
    browser_config = BrowserConfig(
        chrome_instance_path="/path/to/chrome",
        headless=False,
        disable_security=True,
        extra_chromium_args=[
            "--no-first-run",
            "--no-default-browser-check",
            "--disable-extensions",
            "--new-window",
        ],
    )
    browser = Browser(config=browser_config)
    context = BrowserContext(browser=browser)
    
    agent = Agent(
        task=task,
        llm=llm,
        controller=controller,
        browser=browser,
        browser_context=context,
    )
    
    # 执行agent的异步运行逻辑
    asyncio.run(agent.run())


if __name__ == "__main__":
    # 定义两个独立任务
    agent_tasks = [
        "Go to amazon.com and search for toys without logging in",
        "Go to Google.com and find the latest news"
    ]
    
    # 创建并启动进程
    processes = []
    for task in agent_tasks:
        proc = Process(target=run_single_agent, args=(task,))
        processes.append(proc)
        proc.start()
    
    # 等待所有进程完成
    for proc in processes:
        proc.join()

关键细节说明

  • 独立资源初始化:每个进程都会自己创建BrowserLLMController等对象,完全不共享,避免了跨进程资源冲突的问题。
  • 真正的并行:multiprocessing会启动独立的操作系统进程,每个进程都能利用CPU核心,浏览器操作也会真正同时进行,而不是在单线程里切换执行。
  • 环境变量传递os.getenv("OPENAI_API_KEY")在子进程中依然可以正常获取,因为环境变量会被继承到子进程中。

如果你更倾向于用ProcessPoolExecutor,也可以调整代码,不过直接用Process会更直观,不需要处理异步和线程池的混合逻辑,适合这种简单的多任务场景。

备注:内容来源于stack exchange,提问作者Pratik K.

火山引擎 最新活动