非常教程

Elixir 1.5参考手册

任务 | Task

任务管理 | 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,,,funargs...

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...

任务 | Task相关

Elixir 1.5

Elixir 基于 Erlang 虚拟机的函数式、面向并行,是一种较好的编程语言。它以 Erlang 为基础,支持分布式、高容错、实时应用程序的开发。

主页 https://elixir-lang.org/
源码 https://github.com/elixir-lang/elixir
版本 1.5
发布版本 1.5.2