228a2a66e3
- Fix spawn() zombie cell: clean up registry on start() failure - Fix shutdown(): cancel + await tasks that exceed graceful timeout - Fix _shutdown(): await mailbox.close() to release backend resources - Fix escalate directive: stop failing child before propagating to grandparent - Fix RedisMailbox.put(): wrap Redis errors in try/except, return False on failure - Fix retry.py: replace assert with proper raise for last_exc - Add put_batch() to Mailbox abstraction for single-roundtrip bulk enqueue - Add RedisMailbox.put_batch() with atomic Lua script for bounded queues - Add MailboxFullError exception type for semantic backpressure handling - Add redis>=7.4.0 dependency with public PyPI sources in uv.lock Tests added (31 total, up from 27): - test_middleware_on_restart_hook: verifies middleware.on_restart() on supervision restart - test_ask_propagates_actor_exception: ask() re-raises original exception type - test_ask_propagates_exception_while_supervised: exception propagates; root actor survives - test_ask_timeout_late_reply_no_exception: late reply after timeout is silent no-op - test_actor_backpressure.py: MailboxFullError + dead letter on full mailbox - test_actor_retry.py: ask_with_retry with exponential backoff - test_mailbox_redis.py: RedisMailbox put/get/batch/close - bench_actor_redis.py: RedisMailbox throughput benchmarks
47 lines
1.2 KiB
Python
47 lines
1.2 KiB
Python
"""Async Actor framework — lightweight, asyncio-native, supervision-ready.
|
|
|
|
Usage::
|
|
|
|
from deerflow.actor import Actor, ActorSystem
|
|
|
|
class Greeter(Actor):
|
|
async def on_receive(self, message):
|
|
return f"Hello, {message}!"
|
|
|
|
async def main():
|
|
system = ActorSystem("app")
|
|
ref = await system.spawn(Greeter, "greeter")
|
|
reply = await ref.ask("World", timeout=5.0)
|
|
print(reply) # Hello, World!
|
|
await system.shutdown()
|
|
"""
|
|
|
|
from .actor import Actor, ActorContext
|
|
from .mailbox import Mailbox, MemoryMailbox
|
|
from .middleware import Middleware
|
|
from .ref import ActorRef, MailboxFullError, ReplyChannel
|
|
from .retry import IdempotentActorMixin, IdempotencyStore, RetryEnvelope, ask_with_retry
|
|
from .supervision import AllForOneStrategy, Directive, OneForOneStrategy, SupervisorStrategy
|
|
from .system import ActorSystem, DeadLetter
|
|
|
|
__all__ = [
|
|
"Actor",
|
|
"ActorContext",
|
|
"ActorRef",
|
|
"ActorSystem",
|
|
"AllForOneStrategy",
|
|
"DeadLetter",
|
|
"Directive",
|
|
"Mailbox",
|
|
"MailboxFullError",
|
|
"MemoryMailbox",
|
|
"Middleware",
|
|
"OneForOneStrategy",
|
|
"ReplyChannel",
|
|
"RetryEnvelope",
|
|
"SupervisorStrategy",
|
|
"IdempotentActorMixin",
|
|
"IdempotencyStore",
|
|
"ask_with_retry",
|
|
]
|