> This page is for version 0.7.0.
> For other versions, use one of these documentation indexes:
> - Main (default): https://docs.nvidia.com/nemo/gym/main/llms.txt
> - 0.7.0: https://docs.nvidia.com/nemo/gym/v0.7.0/llms.txt
> - 0.6.0: https://docs.nvidia.com/nemo/gym/v0.6.0/llms.txt
> - 0.5.1: https://docs.nvidia.com/nemo/gym/v0.5.1/llms.txt
> - 0.5.0: https://docs.nvidia.com/nemo/gym/v0.5.0/llms.txt
> - 0.4.0: https://docs.nvidia.com/nemo/gym/v0.4.0/llms.txt
> - 0.3.0: https://docs.nvidia.com/nemo/gym/v0.3.0/llms.txt
> - 0.2.1: https://docs.nvidia.com/nemo/gym/v0.2.1/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.nvidia.com/nemo/gym/llms.txt.

# nemo_gym.web.browser_instance_pool

Lease browser instances from a pool of local processes, one X display each.

Each slot is an Xvfb display plus a `nemo_gym.web.browser_instance` server
started with that display, so one resources server can hold as many headed
PyAutoGUI sessions as it has slots. A slot serves one session at a time; after
release it is reused only if its instance is idle and healthy, and is
restarted otherwise. Instances exit on their own when this process dies.

## Module Contents

### Classes

| Name                                                                                                       | Description                                                            |
| ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
| [`LocalBrowserInstancePoolProvider`](#nemo_gym-web-browser_instance_pool-LocalBrowserInstancePoolProvider) | Serve leases from `size` local browser instances.                      |
| [`_LaunchRollbackError`](#nemo_gym-web-browser_instance_pool-_LaunchRollbackError)                         | A partial instance could not be confirmed stopped after launch failed. |
| [`_Slot`](#nemo_gym-web-browser_instance_pool-_Slot)                                                       | -                                                                      |

### Data

[`LOG`](#nemo_gym-web-browser_instance_pool-LOG)

### API

```python
class nemo_gym.web.browser_instance_pool.LocalBrowserInstancePoolProvider(
    size: int,
    port_base: int,
    display_base: int = 100,
    host: str = '127.0.0.1',
    log_dir: str = 'cache/visual-browser/insta...,
    python: str | None = None,
    screen: str = '1920x1080x24',
    startup_timeout_seconds: float = 120.0,
    request_timeout_seconds: float = 600.0
)
```

Serve leases from `size` local browser instances.

The resources server's `max_sessions` should equal `size`; the session
manager rejects seeds beyond it before asking for a lease.

**`_close_task`** `Task[None] | None = None`

---

**`_idle`** `Queue[_Slot] | None = None`

---

**`_leased`** `dict[int, _Slot] = {}`

---

**`_lifecycle_lock`** `= asyncio.Lock()`

---

**`_log_dir`** `= Path(log_dir).expanduser().resolve()`

---

**`_python`** `= python or sys.executable`

---

**`_recycling`** `dict[tuple[int, int], Task[None]] = {}`

---

**`_slots`**

---

**`_startup_cleanup`** `Task[None] | None = None`

---

**`name`** `= 'local_instance_pool'`

---

```python
nemo_gym.web.browser_instance_pool.LocalBrowserInstancePoolProvider._close() -> None
```

async

```python
nemo_gym.web.browser_instance_pool.LocalBrowserInstancePoolProvider._idle_and_healthy(
    slot: nemo_gym.web.browser_instance_pool._Slot
) -> bool
```

```python
nemo_gym.web.browser_instance_pool.LocalBrowserInstancePoolProvider._launch(
    slot: nemo_gym.web.browser_instance_pool._Slot
) -> None
```

```python
nemo_gym.web.browser_instance_pool.LocalBrowserInstancePoolProvider._launch_slot(
    slot: nemo_gym.web.browser_instance_pool._Slot
) -> None
```

```python
nemo_gym.web.browser_instance_pool.LocalBrowserInstancePoolProvider._recycle(
    slot: nemo_gym.web.browser_instance_pool._Slot,
    key: tuple[int, int],
    idle: asyncio.Queue[nemo_gym.web.browser_instance_pool._Slot]
) -> None
```

async

```python
nemo_gym.web.browser_instance_pool.LocalBrowserInstancePoolProvider._rollback_start(
    launches: asyncio.Future
) -> None
```

async

```python
nemo_gym.web.browser_instance_pool.LocalBrowserInstancePoolProvider._stop(
    slot: nemo_gym.web.browser_instance_pool._Slot
) -> None
```

staticmethod

```python
nemo_gym.web.browser_instance_pool.LocalBrowserInstancePoolProvider.acquire(
    spec: nemo_gym.web.browser_session.BrowserSessionSpec
) -> nemo_gym.web.browser_session.BrowserSessionHandle
```

async

```python
nemo_gym.web.browser_instance_pool.LocalBrowserInstancePoolProvider.close() -> None
```

async

```python
nemo_gym.web.browser_instance_pool.LocalBrowserInstancePoolProvider.release(
    handle: nemo_gym.web.browser_session.BrowserSessionHandle
) -> None
```

async

```python
nemo_gym.web.browser_instance_pool.LocalBrowserInstancePoolProvider.start() -> None
```

async

```python
class nemo_gym.web.browser_instance_pool._LaunchRollbackError()
```

**Bases:** [BrowserSessionError](/nemo/gym/nemo-gym/nemo_gym/web/browser_session#nemo_gym-web-browser_session-BrowserSessionError)

A partial instance could not be confirmed stopped after launch failed.

```python
class nemo_gym.web.browser_instance_pool._Slot(
    index: int,
    display: str,
    port: int,
    token: str = '',
    xvfb: subprocess.Popen[bytes] | None = None,
    server: subprocess.Popen[bytes] | None = None,
    tmpdir: pathlib.Path | None = None,
    leases: int = 0,
    restarts: int = 0
)
```

Dataclass

**`display`** `str`

---

**`index`** `int`

---

**`leases`** `int = 0`

---

**`port`** `int`

---

**`restarts`** `int = field(default=0)`

---

**`server`** `Popen[bytes] | None = None`

---

**`tmpdir`** `Path | None = None`

---

**`token`** `str = ''`

---

**`xvfb`** `Popen[bytes] | None = None`

---

```python
nemo_gym.web.browser_instance_pool.LOG = logging.getLogger('nemo_gym.web.browser_instance_pool')
```