Stateless Actors
a day ago
- #Actors
- #Swift Concurrency
- #Stateless Design
- Actors primarily protect mutable state, but stateless actors can still serve purposes, such as providing a Sendable type for easy passing around.
- A NetworkClient actor without state can ensure that synchronous methods like JSON decoding run off the main thread, leveraging a shared thread pool, but it serializes work, potentially limiting concurrency.
- Using a struct with a @concurrent function can avoid serialization issues and protocol incompatibilities, highlighting trade-offs between actors and structs for stateless designs.
- Global actors like @BackgroundActor provide familiar isolation but share drawbacks with NetworkClient, including serial execution and viral type system effects, making them less ideal than learning Swift's existing isolation constructs.
- Custom executor actors integrate Swift's concurrency with other systems, like DispatchQueue, enabling adaptation to preexisting frameworks such as AVFoundation or UI management, as seen with MainActor.
- Actors can manage external state like the file system, offering serialization to prevent corruption in concurrent accesses, though blocking I/O operations can tie up concurrency threads, requiring careful consideration.
- The first rule of actors emphasizes articulating their necessity, as overuse can complicate design, and while stateless actors might indicate misunderstanding, they can be justified in specific contexts.