iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0

比起自己寫 spawn 來執行非同步工作, Task 模組有許多替我們包裝好的非同步 task 函式

async / await

要非同步的執行程式,並在稍後要同步的取得結果

price_task = 
  Task.async(fn ->
    Process.sleep 2000 # 假裝使用外部 API 要等兩秒
    300 # 回傳
  end)

# 做其他事情

Task.await(price_task)

要注意的是

  • await/2 第二個變數是 timeout 時間,預設是 5000,可以是 :infinity
  • await/2 會 block 直到 task 結束或 timeout
  • 其中一個 process 錯誤關閉,另一個也會 (linked)
  • 用了 async 後一定要有 await 來接收,如果不在乎執行結果,使用 start

start

如果不在乎執行後的結果,也不在乎有沒有成功,可以使用 Task.start/1

Task.start(fn ->
  Process.sleep 2000 # 做了一些事
end)

上一篇
07 Agent
下一篇
09 GenServer
系列文
Elixir 多工 : Processes 與 OTP30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言