Tidy up `open_actor_cluster()`, use `.aid`

Update cluster spawning logic to use `.aid` instead of
`.uid` and improve code clarity, typing, style throughout.

Deats,
- change `uid` -> `aid` and use `.aid.name` for cluster
  naming prefix
- add doc-string explaining cluster as actor-based worker
  pool returning `dict[str, Portal]` table.
- improve error msg formatting for name/count mismatch
- change comparison: `not len(names) == count` ->
  `len(names) != count`.
- use remove no-whitespace union style.
- enhance assert msg for portal-count check
- use multiline style where appropes.

(this commit msg was generated in some part by [`claude-code`][claude-code-gh])
[claude-code-gh]: https://github.com/anthropics/claude-code
clustering_to_experimental
Gud Boi 2026-02-11 14:19:09 -05:00
parent 7d594a44b5
commit 99076e0eae
1 changed files with 25 additions and 10 deletions

View File

@ -25,17 +25,21 @@ from contextlib import (
from multiprocessing import cpu_count
from typing import (
AsyncGenerator,
TYPE_CHECKING,
)
import trio
import tractor
if TYPE_CHECKING:
from tractor.msg import Aid
@acm
async def open_actor_cluster(
modules: list[str],
count: int = cpu_count(),
names: list[str] | None = None,
names: list[str]|None = None,
hard_kill: bool = False,
# passed through verbatim to ``open_root_actor()``
@ -45,15 +49,26 @@ async def open_actor_cluster(
dict[str, tractor.Portal],
None,
]:
'''
Open an "actor cluster", much like a "process worker pool" but where
each primitive is a full `tractor.Actor` allocated as a batch and
mapped via a `dict[str, Portal]` table returned to the caller.
'''
portals: dict[str, tractor.Portal] = {}
if not names:
names = [f'worker_{i}' for i in range(count)]
names: list[str] = [
f'worker_{i}'
for i in range(count)
]
if not len(names) == count:
if len(names) != count:
raise ValueError(
'Number of names is {len(names)} but count it {count}')
f'Number of subactor names != count ??\n'
f'len(name) = {len(names)!r}\n'
f'count = {count!r}\n'
)
async with (
# tractor.trionics.collapse_eg(),
@ -66,18 +81,18 @@ async def open_actor_cluster(
trio.open_nursery() as tn,
tractor.trionics.maybe_raise_from_masking_exc()
):
uid = tractor.current_actor().uid
aid: Aid = tractor.current_actor().aid
async def _start(name: str) -> None:
name = f'{uid[0]}.{name}'
portals[name] = await an.start_actor(
enable_modules=modules,
name=name,
name=f'{aid.name}.{name}',
)
for name in names:
tn.start_soon(_start, name)
assert len(portals) == count
assert len(portals) == count, 'Portal-count mismatch?\n'
yield portals
await an.cancel(hard_kill=hard_kill)
await an.cancel(
hard_kill=hard_kill
)