@@ -137,67 +137,6 @@ defmodule DynamicSupervisor do
137
137
138
138
A supervisor is bound to the same name registration rules as a `GenServer`.
139
139
Read more about these rules in the documentation for `GenServer`.
140
-
141
- ## Migrating from Supervisor's :simple_one_for_one
142
-
143
- In case you were using the deprecated `:simple_one_for_one` strategy from
144
- the `Supervisor` module, you can migrate to the `DynamicSupervisor` in
145
- few steps.
146
-
147
- Imagine the given "old" code:
148
-
149
- defmodule MySupervisor do
150
- use Supervisor
151
-
152
- def start_link(init_arg) do
153
- Supervisor.start_link(__MODULE__, init_arg, name: __MODULE__)
154
- end
155
-
156
- def start_child(foo, bar, baz) do
157
- # This will start child by calling MyWorker.start_link(init_arg, foo, bar, baz)
158
- Supervisor.start_child(__MODULE__, [foo, bar, baz])
159
- end
160
-
161
- @impl true
162
- def init(init_arg) do
163
- children = [
164
- # Or the deprecated: worker(MyWorker, [init_arg])
165
- %{id: MyWorker, start: {MyWorker, :start_link, [init_arg]}}
166
- ]
167
-
168
- Supervisor.init(children, strategy: :simple_one_for_one)
169
- end
170
- end
171
-
172
- It can be upgraded to the DynamicSupervisor like this:
173
-
174
- defmodule MySupervisor do
175
- use DynamicSupervisor
176
-
177
- def start_link(init_arg) do
178
- DynamicSupervisor.start_link(__MODULE__, init_arg, name: __MODULE__)
179
- end
180
-
181
- def start_child(foo, bar, baz) do
182
- # If MyWorker is not using the new child specs, we need to pass a map:
183
- # spec = %{id: MyWorker, start: {MyWorker, :start_link, [foo, bar, baz]}}
184
- spec = {MyWorker, foo: foo, bar: bar, baz: baz}
185
- DynamicSupervisor.start_child(__MODULE__, spec)
186
- end
187
-
188
- @impl true
189
- def init(init_arg) do
190
- DynamicSupervisor.init(
191
- strategy: :one_for_one,
192
- extra_arguments: [init_arg]
193
- )
194
- end
195
- end
196
-
197
- The difference is that the `DynamicSupervisor` expects the child specification
198
- at the moment `start_child/2` is called, and no longer on the init callback.
199
- If there are any initial arguments given on initialization, such as `[initial_arg]`,
200
- it can be given in the `:extra_arguments` flag on `DynamicSupervisor.init/1`.
201
140
"""
202
141
203
142
@ behaviour GenServer
@@ -233,9 +172,10 @@ defmodule DynamicSupervisor do
233
172
@ typedoc """
234
173
Return values of `start_child` functions.
235
174
236
- Unlike `Supervisor`, this module ignores the child spec ids, so
237
- `{:error, {:already_started, pid}}` is not returned for child specs given with the same id.
238
- `{:error, {:already_started, pid}}` is returned however if a duplicate name is used when using
175
+ Unlike `Supervisor`, this module ignores the child spec ids,
176
+ so `{:error, {:already_started, pid}}` is not returned for child specs
177
+ given with the same id. `{:error, {:already_started, pid}}` is returned
178
+ however if a duplicate name is used when using
239
179
[name registration](`m:GenServer#module-name-registration`).
240
180
"""
241
181
@ type on_start_child ::
@@ -415,6 +355,10 @@ defmodule DynamicSupervisor do
415
355
`{:error, {:already_started, pid}}` is returned however if a duplicate name is
416
356
used when using [name registration](`m:GenServer#module-name-registration`).
417
357
358
+ This function will block the `DynamicSupervisor` until the child initializes.
359
+ When starting too many processes dynamically, you may want to use a
360
+ `PartitionSupervisor` to split the work across multiple processes.
361
+
418
362
If the child process start function returns `{:ok, child}` or `{:ok, child,
419
363
info}`, then child specification and PID are added to the supervisor and
420
364
this function returns the same value.
@@ -518,6 +462,14 @@ defmodule DynamicSupervisor do
518
462
@ doc """
519
463
Terminates the given child identified by `pid`.
520
464
465
+ This function will block the `DynamicSupervisor` until the child
466
+ terminates, which may take an arbitrary amount of time if the child
467
+ is trapping exits and implements its own terminate callback.
468
+ For this reason, it is often better to ask the child process
469
+ itself to terminate, often by declaring in its child spec it has
470
+ a restart strategy of `:transient` (or `:temporary`) and then
471
+ sending it a message to stop with reason `:shutdown`.
472
+
521
473
If successful, this function returns `:ok`. If there is no process with
522
474
the given PID, this function returns `{:error, :not_found}`.
523
475
"""
0 commit comments