> This page is for version Main (default).
> 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.site_pool

Site-stack lease boundary and in-process reader/writer scheduling.

## Module Contents

### Classes

| Name                                                                           | Description                                                            |
| ------------------------------------------------------------------------------ | ---------------------------------------------------------------------- |
| [`LocalSiteLockPool`](#nemo_gym-web-site_pool-LocalSiteLockPool)               | Coordinate shared readers and exclusive writers for configured sites.  |
| [`SiteCapacityError`](#nemo_gym-web-site_pool-SiteCapacityError)               | A site already has its maximum number of concurrent sessions.          |
| [`SiteConcurrencyLimitPool`](#nemo_gym-web-site_pool-SiteConcurrencyLimitPool) | Cap concurrent sessions per site; tasks on other sites are unaffected. |
| [`SiteLease`](#nemo_gym-web-site_pool-SiteLease)                               | -                                                                      |
| [`SitePool`](#nemo_gym-web-site_pool-SitePool)                                 | -                                                                      |
| [`UnmanagedSitePool`](#nemo_gym-web-site_pool-UnmanagedSitePool)               | Use externally configured sites without reset or isolation guarantees. |
| [`_LocalLeaseState`](#nemo_gym-web-site_pool-_LocalLeaseState)                 | -                                                                      |

### API

```python
class nemo_gym.web.site_pool.LocalSiteLockPool()
```

Coordinate shared readers and exclusive writers for configured sites.

Locks prevent concurrent tasks from mutating the same site stack; they do
not reset or isolate site data. Cross-site tasks acquire all locks in one
condition critical section, avoiding partial acquisition and deadlocks.

**`_READER_MUTATIONS`** `= frozenset({'read_only', 'session_only'})`

---

**`_active`** `dict[str, _LocalLeaseState] = {}`

---

**`_condition`** `= asyncio.Condition()`

---

**`_readers`** `Counter[str] = Counter()`

---

**`_writers`** `set[str] = set()`

---

```python
nemo_gym.web.site_pool.LocalSiteLockPool._can_acquire(
    sites: tuple[str, ...],
    access: str
) -> bool
```

```python
nemo_gym.web.site_pool.LocalSiteLockPool._sites(
    task: nemo_gym.web.models.WebTask
) -> tuple[str, ...]
```

staticmethod

```python
nemo_gym.web.site_pool.LocalSiteLockPool.acquire(
    session_id: str,
    task: nemo_gym.web.models.WebTask
) -> nemo_gym.web.site_pool.SiteLease
```

async

```python
nemo_gym.web.site_pool.LocalSiteLockPool.health() -> dict[str, typing.Any]
```

async

```python
nemo_gym.web.site_pool.LocalSiteLockPool.release(
    lease: nemo_gym.web.site_pool.SiteLease,
    healthy: bool
) -> None
```

async

```python
class nemo_gym.web.site_pool.SiteCapacityError()
```

**Bases:** `RuntimeError`

A site already has its maximum number of concurrent sessions.

```python
class nemo_gym.web.site_pool.SiteConcurrencyLimitPool(
    max_sessions_per_site: int
)
```

Cap concurrent sessions per site; tasks on other sites are unaffected.

Public sites rate-limit by client IP. When many rollouts share one egress
IP, a burst of sessions on one site (GitHub, Hugging Face) triggers those
limits and turns tasks into site-access failures. A full site rejects the
seed instead of queueing it, so the caller retries later and the slot it
would have held stays free for other sites.

**`_active`** `dict[str, tuple[str, ...]] = {}`

---

**`_counts`** `Counter[str] = Counter()`

---

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

---

**`_rejected`** `= 0`

---

```python
nemo_gym.web.site_pool.SiteConcurrencyLimitPool.acquire(
    session_id: str,
    task: nemo_gym.web.models.WebTask
) -> nemo_gym.web.site_pool.SiteLease
```

async

```python
nemo_gym.web.site_pool.SiteConcurrencyLimitPool.health() -> dict[str, typing.Any]
```

async

```python
nemo_gym.web.site_pool.SiteConcurrencyLimitPool.release(
    lease: nemo_gym.web.site_pool.SiteLease,
    healthy: bool
) -> None
```

async

```python
class nemo_gym.web.site_pool.SiteLease(
    lease_id: str,
    isolated: bool,
    metadata: dict[str, typing.Any] = dict()
)
```

Dataclass

**`isolated`** `bool`

---

**`lease_id`** `str`

---

**`metadata`** `dict[str, Any] = field(default_factory=dict)`

---

```python
class nemo_gym.web.site_pool.SitePool()
```

Protocol

```python
nemo_gym.web.site_pool.SitePool.acquire(
    session_id: str,
    task: nemo_gym.web.models.WebTask
) -> nemo_gym.web.site_pool.SiteLease
```

async

```python
nemo_gym.web.site_pool.SitePool.health() -> dict[str, typing.Any]
```

async

```python
nemo_gym.web.site_pool.SitePool.release(
    lease: nemo_gym.web.site_pool.SiteLease,
    healthy: bool
) -> None
```

async

```python
class nemo_gym.web.site_pool.UnmanagedSitePool()
```

Use externally configured sites without reset or isolation guarantees.

**`_active`** `set[str] = set()`

---

```python
nemo_gym.web.site_pool.UnmanagedSitePool.acquire(
    session_id: str,
    task: nemo_gym.web.models.WebTask
) -> nemo_gym.web.site_pool.SiteLease
```

async

```python
nemo_gym.web.site_pool.UnmanagedSitePool.health() -> dict[str, typing.Any]
```

async

```python
nemo_gym.web.site_pool.UnmanagedSitePool.release(
    lease: nemo_gym.web.site_pool.SiteLease,
    healthy: bool
) -> None
```

async

```python
class nemo_gym.web.site_pool._LocalLeaseState(
    sites: tuple[str, ...],
    access: str
)
```

Dataclass

**`access`** `str`

---

**`sites`** `tuple[str, ...]`

---