当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir Task.Supervisor.async_stream用法及代码示例


Elixir语言中 Task.Supervisor.async_stream 相关用法介绍如下。

用法:

async_stream(supervisor, enumerable, module, function, args, options \\ [])
(从 1.4.0 开始)
@spec async_stream(
  Supervisor.supervisor(),
  Enumerable.t(),
  module(),
  atom(),
  [term()],
  keyword()
) ::
  Enumerable.t()

返回一个流,其中给定函数(modulefunction)同时映射到 enumerable 中的每个元素上。

每个元素将被添加到给定的args 并由其自己的任务处理。任务将在给定的 supervisor 下生成并链接到调用者进程,类似于 async/5

流式传输时,每个任务将在成功完成时发出{:ok, value},如果调用者正在捕获退出,则发出{:exit, reason}。结果的顺序取决于:ordered 选项的值。

并发级别和允许任务运行的时间可以通过选项来控制(参见下面的"Options" 部分)。

如果您发现自己捕获退出以处理异步流中的退出,请考虑使用 async_stream_nolink/6 来启动未链接到调用进程的任务。

选项

  • :max_concurrency - 设置同时运行的最大任务数。默认为 System.schedulers_online/0

  • :ordered - 结果是否应以与输入流相同的顺序返回。当您有大型流并且不想在结果交付之前缓冲结果时,此选项很有用。当您将任务用于副作用时,这也很有用。默认为 true

  • :timeout - 在没有收到任务回复的情况下(所有正在运行的任务)等待的最长时间(以毫秒为单位)。默认为 5000

  • :on_timeout - 当任务超时时该怎么办。可能的值是:

    • :exit(默认)- 产生任务的进程退出。
    • :kill_task - 超时的任务被杀死。为该任务发出的值是 {:exit, :timeout}
  • :shutdown - :brutal_kill 如果任务必须在关机时直接终止,或者是一个指示超时值的整数。默认为 5000 毫秒。

例子

让我们构建一个流,然后枚举它:

stream = Task.Supervisor.async_stream(MySupervisor, collection, Mod, :expensive_fun, [])
Enum.to_list(stream)

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Task.Supervisor.async_stream(supervisor, enumerable, module, function, args, options \\ [])。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。