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-codeclustering_to_experimental
parent
7d594a44b5
commit
99076e0eae
|
|
@ -25,17 +25,21 @@ from contextlib import (
|
||||||
from multiprocessing import cpu_count
|
from multiprocessing import cpu_count
|
||||||
from typing import (
|
from typing import (
|
||||||
AsyncGenerator,
|
AsyncGenerator,
|
||||||
|
TYPE_CHECKING,
|
||||||
)
|
)
|
||||||
|
|
||||||
import trio
|
import trio
|
||||||
import tractor
|
import tractor
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from tractor.msg import Aid
|
||||||
|
|
||||||
|
|
||||||
@acm
|
@acm
|
||||||
async def open_actor_cluster(
|
async def open_actor_cluster(
|
||||||
modules: list[str],
|
modules: list[str],
|
||||||
count: int = cpu_count(),
|
count: int = cpu_count(),
|
||||||
names: list[str] | None = None,
|
names: list[str]|None = None,
|
||||||
hard_kill: bool = False,
|
hard_kill: bool = False,
|
||||||
|
|
||||||
# passed through verbatim to ``open_root_actor()``
|
# passed through verbatim to ``open_root_actor()``
|
||||||
|
|
@ -45,15 +49,26 @@ async def open_actor_cluster(
|
||||||
dict[str, tractor.Portal],
|
dict[str, tractor.Portal],
|
||||||
None,
|
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] = {}
|
portals: dict[str, tractor.Portal] = {}
|
||||||
|
|
||||||
if not names:
|
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(
|
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 (
|
async with (
|
||||||
# tractor.trionics.collapse_eg(),
|
# tractor.trionics.collapse_eg(),
|
||||||
|
|
@ -66,18 +81,18 @@ async def open_actor_cluster(
|
||||||
trio.open_nursery() as tn,
|
trio.open_nursery() as tn,
|
||||||
tractor.trionics.maybe_raise_from_masking_exc()
|
tractor.trionics.maybe_raise_from_masking_exc()
|
||||||
):
|
):
|
||||||
uid = tractor.current_actor().uid
|
aid: Aid = tractor.current_actor().aid
|
||||||
|
|
||||||
async def _start(name: str) -> None:
|
async def _start(name: str) -> None:
|
||||||
name = f'{uid[0]}.{name}'
|
|
||||||
portals[name] = await an.start_actor(
|
portals[name] = await an.start_actor(
|
||||||
enable_modules=modules,
|
enable_modules=modules,
|
||||||
name=name,
|
name=f'{aid.name}.{name}',
|
||||||
)
|
)
|
||||||
|
|
||||||
for name in names:
|
for name in names:
|
||||||
tn.start_soon(_start, name)
|
tn.start_soon(_start, name)
|
||||||
|
|
||||||
assert len(portals) == count
|
assert len(portals) == count, 'Portal-count mismatch?\n'
|
||||||
yield portals
|
yield portals
|
||||||
await an.cancel(hard_kill=hard_kill)
|
await an.cancel(
|
||||||
|
hard_kill=hard_kill
|
||||||
|
)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue