如何并行运行多个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()
关键细节说明
- 独立资源初始化:每个进程都会自己创建
Browser、LLM、Controller等对象,完全不共享,避免了跨进程资源冲突的问题。 - 真正的并行:multiprocessing会启动独立的操作系统进程,每个进程都能利用CPU核心,浏览器操作也会真正同时进行,而不是在单线程里切换执行。
- 环境变量传递:
os.getenv("OPENAI_API_KEY")在子进程中依然可以正常获取,因为环境变量会被继承到子进程中。
如果你更倾向于用ProcessPoolExecutor,也可以调整代码,不过直接用Process会更直观,不需要处理异步和线程池的混合逻辑,适合这种简单的多任务场景。
备注:内容来源于stack exchange,提问作者Pratik K.




