任务管理 | Task.Supervisor
Task.Supervisor
任务主管。
该模块定义了一个可用于动态监控任务的监控器。
start_link/1
可以用来启动主管。见Task
模块获取更多示例。
姓名登记
Task.Supervisor
必须与a相同的名称注册规则GenServer
。在GenServer
文档中阅读更多关于它们的内容。
摘要
类型
option()
选项值start_link
功能
async(supervisor, fun)
启动一个可以等待的任务
async(supervisor, module, fun, args)
启动一个可以等待的任务
async_nolink(supervisor, fun)
启动一个可以等待的任务
async_nolink(supervisor, module, fun, args)
启动一个可以等待的任务
async_stream(supervisor, enumerable, fun, options \ [])
返回运行给定函数的流。fun
中的每个项目并发enumerable
async_stream(supervisor, enumerable, module, function, args, options \ [])
返回运行给定module
,,,function
,和args
中的每个项目并发enumerable
async_stream_nolink(supervisor, enumerable, fun, options \ [])
返回运行给定function
中的每个项目并发enumerable
async_stream_nolink(supervisor, enumerable, module, function, args, options \ [])
返回运行给定module
,,,function
,和args
中的每个项目并发enumerable
children(supervisor)
返回所有子PID
start_child(supervisor, fun)
作为给定对象的子任务启动任务。supervisor
start_child(supervisor, module, fun, args)
作为给定对象的子任务启动任务。supervisor
start_link(opts \ [])
启动一个新的主管
terminate_child(supervisor, pid)
使用给定的pid
类型
option()
option ::
Supervisor.option |
{:restart, :supervisor.restart} |
{:shutdown, :supervisor.shutdown}
选项值start_link
功能
async(supervisor, fun)
async(Supervisor.supervisor, (() -> any)) :: Task.t
开始一项可以等待的任务。
在supervisor
必须在定义的参考Task.Supervisor
。该任务仍将与调用者相关联,请参阅Task.async/3
更多信息以及async_nolink/2
非链接变体。
请注意,此功能要求任务管理器具有:temporary
作为:restart
选项(默认值)的选项,async/2
以便在任务重新启动时保持直接引用丢失的任务。
async(supervisor, module, fun, args)
async(Supervisor.supervisor, module, atom, [term]) :: Task.t
开始一项可以等待的任务。
在supervisor
必须在定义的参考Task.Supervisor
。该任务仍将与调用者相关联,请参阅Task.async/3
更多信息以及async_nolink/2
非链接变体。
请注意,此功能要求任务管理器具有:temporary
作为:restart
选项(默认值)的选项,async/4
以便在任务重新启动时保持直接引用丢失的任务。
async_nolink(supervisor, fun)
async_nolink(Supervisor.supervisor, (() -> any)) :: Task.t
开始一项可以等待的任务。
在supervisor
必须在定义的参考Task.Supervisor
。该任务将不会链接到调用者,请参阅Task.async/3
以获取更多信息。
请注意,此功能要求任务管理器具有:temporary
作为:restart
选项(默认值)的选项,async_nolink/2
以便在任务重新启动时保持直接引用丢失的任务。
与OTP行为的兼容性
如果您使用async_nolink
在OTP行为中,比如GenServer
,您应该匹配来自任务内部的消息。GenServer.handle_info/2
回调。
任务发送的答复将采用以下格式{ref, result}
,在哪里ref
是由任务结构和result
任务函数的返回值。
记住,不管任务是如何创建的async_nolink
终止时,调用方的进程将始终收到:DOWN
消息具有相同的ref
由任务结构持有的值。如果任务正常终止,则:DOWN
信息将是:normal
...
async_nolink(supervisor, module, fun, args)
async_nolink(Supervisor.supervisor, module, atom, [term]) :: Task.t
开始一项可以等待的任务。
在supervisor
必须在定义的参考Task.Supervisor
。该任务将不会链接到调用者,请参阅Task.async/3
以获取更多信息。
请注意,此功能要求任务管理器具有:temporary
作为:restart
选项(默认值)的选项,async_nolink/4
以便在任务重新启动时保持直接引用丢失的任务。
async_stream(supervisor, enumerable, fun, options \ [])
async_stream(Supervisor.supervisor, Enumerable.t, (term -> term), keyword) :: Enumerable.t
返回运行给定函数的流。fun
中的每个项目并发enumerable
...
每一项enumerable
作为参数传递给给定的函数。fun
并由自己的任务处理。任务将在给定的supervisor
并与当前进程相关联,类似于async/2
...
见async_stream/6
供讨论、选项和示例。
async_stream(supervisor, enumerable, module, function, args, options \ [])
async_stream(Supervisor.supervisor, Enumerable.t, module, atom, [term], keyword) :: Enumerable.t
返回运行给定module
,,,function
,和args
中的每个项目并发enumerable
...
每个项目都将优先于给定的args
并由自己的任务处理。任务将在给定的supervisor
并与当前进程相关联,类似于async/4
...
当流化时,每个任务将发出{:ok, value}
在成功完成后,或{:exit, reason}
如果呼叫者正在陷阱出口。结果以与原始结果相同的顺序发出。enumerable
...
并发级别可以通过:max_concurrency
选项和默认值为System.schedulers_online/0
也可以将超时作为表示在没有任务答复的情况下等待的最大时间的选项。
请注意,此功能要求任务管理器具有:temporary
作为:restart
选项(默认值)的选项,async_stream/6
以便在任务重新启动时保持直接引用丢失的任务。
最后,如果您发现自己捕获出口以处理异步流中的出口,请考虑使用async_stream_nolink/6
若要启动未链接到当前进程的任务,请执行以下操作。
备选方案
:max_concurrency
-设置同时运行的最大任务数。默认为System.schedulers_online/0
...
:ordered
-是否应按照输入流的相同顺序返回结果。当您有较大的流并且不希望在结果交付之前缓冲时,此选项非常有用。默认为true
...
:timeout
- 没有收到任务回复(等待所有正在运行的任务)的最长等待时间(以毫秒为单位)。默认为5000
。
:on_timeout
-当任务超时时,该怎么办?可能的价值是:
- `:exit` (default) - the process that spawned the tasks exits.
- `:kill_task` - the task that timed out is killed. The value emitted for that task is `{:exit, :timeout}`.
实例
让我们构建一个流,然后枚举它:
stream = Task.Supervisor.async_stream(MySupervisor, collection, Mod, :expensive_fun, [])
Enum.to_list(stream)
async_stream_nolink(supervisor,enumerable,fun,options \ [])
async_stream_nolink(Supervisor.supervisor, Enumerable.t, (term -> term), keyword) :: Enumerable.t
返回运行给定function
中的每个项目并发enumerable
...
每一项enumerable
作为参数传递给给定的函数。fun
并由自己的任务处理。任务将在给定的supervisor
并与当前进程相关联,类似于async_nolink/2
...
见async_stream/6
供讨论和举例。
async_stream_nolink(supervisor,enumerable,module,function,args,options \ [])
async_stream_nolink(Supervisor.supervisor, Enumerable.t, module, atom, [term], keyword) :: Enumerable.t
返回运行给定module
,,,function
,和args
中的每个项目并发enumerable
...
每一项enumerable
将优先于给定的args
并由自己的任务处理。任务将在给定的supervisor
并且不会与当前的进程相关联,类似于async_nolink/4
...
见async_stream/6
供讨论、选项和示例。
children(supervisor)
children(Supervisor.supervisor) :: [pid]
返回所有子PID。
start_child(supervisor, fun)
start_child(Supervisor.supervisor, (() -> any)) :: {:ok, pid}
作为给定对象的子任务启动任务。supervisor
...
请注意,产生的进程没有链接到调用者,而是仅链接到主管。如果任务需要执行副作用(如I / O)并且不需要向调用方报告,此命令很有用。
start_child(supervisor, module, fun, args)
start_child(Supervisor.supervisor, module, atom, [term]) :: {:ok, pid}
作为给定对象的子任务启动任务。supervisor
...
类似于start_child/2
除非任务由给定的module
,,,fun
和args
...
start_link(opts \ [])
start_link([option]) :: Supervisor.on_start
开始一个新的主管。
所支持的备选方案如下:
:name
-用于注册主管名称,所支持的值在Name Registration
部分GenServer
模块文档;
:restart
- 重启策略,可能是:temporary
(默认),:transient
或者:permanent
。:temporary
意味着任务不会再重新启动,:transient
意味着它重新启动,如果出口不是:normal
,:shutdown
或{:shutdown, reason}
。一:permanent
重启策略意味着它总是重新启动。它默认为:temporary
这样,任务在完成时不会自动重启,也不会在崩溃的情况下重启。请注意:async
,此模块中的功能仅支持:temporary
重新启动;
:shutdown
---:brutal_kill
如果任务必须在关机时直接终止,或者是一个指示超时值的整数,则默认为5000毫秒;
:max_restarts
和:max_seconds
-如Supervisor
;
terminate_child(supervisor, pid)
terminate_child(Supervisor.supervisor, pid) :: :ok
使用给定的pid
...