2016-08-19 16 views
4

私は私の '更新'機能で実行する必要がある実際に計算コストの高いコードを持っています。Elmの並行性

実行すると、私のアプリケーション全体が終了するまでブロックされます。

ブロックを防ぐためにこのコードを非同期で実行する方法はありますか? (ポートを使用せず、エルムに滞在中)

+1

https://github.com/rtfeldman/elm-web-workersのようなものを使用していますか? – Tosh

+0

私ができるならば、私はむしろ別の方法を見つけることが現時点では厄介なようです。より複雑な種類のelmのみの文字列を渡すことはできません – doodledood

答えて

0

タスクとして実行することができます。私は、彼らがCPU容量の全体を使用して、いくつかの場合にはどのように機能するかわからないんですが、タスクが先制、アプリケーションの他の部分を実行するために停止することができます。

DoHeavyStuff a b -> 
    let 
     task param1 param2 = 
      Task.succeed 1 
      `Task.andThen` (\_ -> Task.succeed <| expensive param1 param2) 
    in 
    (model, Task.perform NoOp FinishedWork (task a b)) 

FinishedWork result -> 
    ... 
+0

残念ながら、elmが厳密な言語であるため、タスクが実行される前に高価な操作が評価されるため、機能しません。全体がまだブロックされている:( – doodledood

+0

おそらくandThenトリックで試してみようか?Task.suceed 1 andThen \ _-> expensive' –

+0

'andThen'の右側には、結果を返す関数ではなくTaskを返す関数が必要です:/このように私たちはそれから出ることができないようだよ – doodledood

1

エルムタスクは、事前に対応していません。 emptiveマルチタスキング。

Process.spawnとすると、Task.andThenの引数として使用されたときにコンテキストスイッチするタスクを構築できます。

しかし、これらの場合、結果のタスクのタイプがTask x Process.Idであるという制約内で作業する必要があります。つまり、タスクの結果をメインアプリに簡単に伝達する手段がありません。

Process.Idの場合はthe documentationを参照してください。

+0

私は数日前にProcess.Idを使って実際に試しましたが、同じブロック効果を出すように見えました:( –

+0

タスクはありませんDocsが言うように、 'Task.andThen'のスイッチ? –

+1

現時点ではかなり役に立たず、まだブロックされています...このバージョンではできないようです – doodledood