mirror of https://github.com/yewstack/yew
65 lines
2.1 KiB
Plaintext
65 lines
2.1 KiB
Plaintext
---
|
|
title: 'Agents'
|
|
description: "Yew's Actor System"
|
|
---
|
|
|
|
import useBaseUrl from '@docusaurus/useBaseUrl'
|
|
import ThemedImage from '@theme/ThemedImage'
|
|
|
|
Agents are a way to offload tasks to web workers.
|
|
|
|
In order for agents to run concurrently, Yew uses
|
|
[web-workers](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers).
|
|
|
|
## Lifecycle
|
|
|
|
<!--
|
|
The diagram is produced with nomnoml (nomnoml.com),
|
|
The code can be found in the <desc> tag of the svgs.
|
|
-->
|
|
|
|
<ThemedImage
|
|
alt="agent lifecycle diagram"
|
|
sources={{
|
|
light: useBaseUrl('/img/agent-lifecycle-light.svg'),
|
|
dark: useBaseUrl('/img/agent-lifecycle-dark.svg'),
|
|
}}
|
|
/>
|
|
|
|
## Types of Agents
|
|
|
|
### Reaches
|
|
|
|
- Public - There will exist at most one instance of a Public Agent at any given time. Bridges will
|
|
spawn or connect to an already spawned agent in a web worker.
|
|
When no bridges are connected to this agent, the agent will disappear.
|
|
|
|
- Private - Spawn a new agent in a web worker for every new bridge. This is good for moving shared but
|
|
independent behavior that communicates with the browser out of components. When
|
|
the connected bridge is dropped, the agent will disappear.
|
|
|
|
- Global \(WIP\)
|
|
|
|
## Communication between Agents and Components
|
|
|
|
### Bridges
|
|
|
|
A bridge allows bi-directional communication between an agent and a component. Bridges also allow agents to communicate with one another.
|
|
|
|
A `use_bridge` hook is also provided to create bridges in a function component.
|
|
|
|
### Dispatchers
|
|
|
|
A dispatcher allows uni-directional communication between a component and an agent. A dispatcher allows a component to send messages to an agent.
|
|
|
|
## Overhead
|
|
|
|
Agents use web workers \(i.e. Private and Public\). They incur a serialization overhead on the
|
|
messages they send and receive. Agents use [bincode](https://github.com/bincode-org/bincode) to communicate
|
|
with other threads, so the cost is substantially higher than just calling a function.
|
|
|
|
## Further reading
|
|
|
|
- The [web_worker_fib](https://github.com/yewstack/yew/tree/master/examples/web_worker_fib) example shows how
|
|
components can send messages to and receive messages from agents.
|