pythonbrowser-automationbrowser-use

How to run multiple browser-use agents in parallel?


Currently I have this code

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
:brief: Run multiple browser-use agents in parallel
"""
import asyncio
import os

from browser_use import Agent, Browser, BrowserConfig, Controller
from browser_use.browser.context import BrowserContext, BrowserContextConfig
from langchain_openai import ChatOpenAI


async def main():
    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)
    context1 = BrowserContext(browser=browser)
    context2 = BrowserContext(browser=browser)

    agent = Agent(
        task="Go to amazon.com and search for toys without logging in",
        llm=llm,
        controller=controller,
        browser=browser,
        browser_context=context1,
    )

    agent2 = Agent(
        task="Go to Google.com and find the latest news",
        llm=llm,
        controller=controller,
        browser=browser,
        browser_context=context2,
    )

    await asyncio.gather(agent.run(), agent2.run())

if __name__ == "__main__":
    asyncio.run(main())

But, it does not truly run in parellel. I was considering using ProcessPoolExecutor but not sure how to mix concurrent.futures and asyncio cleanly. Essentially, the approach should be to create 2 different browser instances so that the agents can work in tandem.


Solution

  • I found a simple reference implementation in the source code of browser-use. Essentially, we need to create a global browser object and share it amongst the various agents. They can be run in parallel using asyncio.gather.

    import os
    import sys
    
    sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
    import asyncio
    
    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 = Browser(
        config=BrowserConfig(
            disable_security=True,
            headless=False,
            new_context_config=BrowserContextConfig(save_recording_path='./tmp/recordings'),
        )
    )
    llm = ChatOpenAI(model='gpt-4o')
    
    
    async def main():
        agents = [
            Agent(task=task, llm=llm, browser=browser)
            for task in [
                'Search Google for weather in Tokyo',
                'Check Reddit front page title',
                'Look up Bitcoin price on Coinbase',
                'Find NASA image of the day',
                # 'Check top story on CNN',
                # 'Search latest SpaceX launch date',
                # 'Look up population of Paris',
                # 'Find current time in Sydney',
                # 'Check who won last Super Bowl',
                # 'Search trending topics on Twitter',
            ]
        ]
    
        await asyncio.gather(*[agent.run() for agent in agents])
        await browser.close()
    
    
    if __name__ == '__main__':
        asyncio.run(main())