LoginSignup
2
1

More than 3 years have passed since last update.

PureScriptで非同期処理

Last updated at Posted at 2019-10-13

はじめに

簡単な例を書きます。

例のために、こんな関数を用意しておきます。

alog :: String -> Aff Unit
alog = liftEffect <<< log

delay' :: Number -> Aff Unit
delay' = delay <<< Milliseconds

例1

Effect内で複数の処理(launchAff_ の中)を非同期で実行します。各処理の最初のログは同時に表示されますが、次のログは各々が持つ遅延処理を終えてからバラバラに出力されます。

例1
main :: Effect Unit
main = do
  launchAff_ do
    alog "[1 - 1]"
    delay' 2100.0
    alog "[1 - 2]"

  launchAff_ do
    alog "[2 - 1]"
    delay' 1000.0
    alog "[2 - 2]"

  launchAff_ do
    alog "[3 - 1]"
    delay' 3500.0
    alog "[3 - 2]"

  launchAff_ do
    alog "[4 - 1]"
    delay' 1800.0
    alog "[4 - 2]"

例2

Effect内で1つの非同期処理(launchAff_ の中)を立ち上げ、その中で複数の非同期処理(forkAff の中)を実行します。結果は例1と同じように見えます。

例2
main :: Effect Unit
main = launchAff_ do
  _ <- forkAff do
    alog "[1 - 1]"
    delay' 2100.0
    alog "[1 - 2]"

  _ <- forkAff do
    alog "[2 - 1]"
    delay' 1000.0
    alog "[2 - 2]"

  _ <- forkAff do
    alog "[3 - 1]"
    delay' 3500.0
    alog "[3 - 2]"

  forkAff do
    alog "[4 - 1]"
    delay' 1800.0
    alog "[4 - 2]"

例3

複数の非同期処理から得た戻り値を使います。

例3
main :: Effect Unit
main = launchAff_ do
  f1 <- forkAff do
    alog "[1 - 1]"
    delay' 5100.0
    alog "[1 - 2]"
    pure "[1]"

  f2 <- forkAff do
    alog "[2 - 1]"
    delay' 1000.0
    alog "[2 - 2]"
    pure "[2]"

  _  <- forkAff do
    alog "[3 - 1]"
    delay' 3500.0
    alog "[3 - 2]"

  f4 <- forkAff do
    alog "[4 - 1]"
    delay' 1800.0
    alog "[4 - 2]"
    pure "[4]"

  f2' <- joinFiber f2

  alog $ f2'

  f4' <- joinFiber f4

  f1' <- joinFiber f1

  alog $ f1' <> f2' <> f4'

※ ここで、一番時間のかかる処理はf1です。joinFiberによってf1の結果を先に取得しようとすると、f1が終わるまでその先がブロックされてしまいます。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1