當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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 \\ [])。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。