私は私の '更新'機能で実行する必要がある実際に計算コストの高いコードを持っています。Elmの並行性
実行すると、私のアプリケーション全体が終了するまでブロックされます。
ブロックを防ぐためにこのコードを非同期で実行する方法はありますか? (ポートを使用せず、エルムに滞在中)
私は私の '更新'機能で実行する必要がある実際に計算コストの高いコードを持っています。Elmの並行性
実行すると、私のアプリケーション全体が終了するまでブロックされます。
ブロックを防ぐためにこのコードを非同期で実行する方法はありますか? (ポートを使用せず、エルムに滞在中)
タスクとして実行することができます。私は、彼らが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 ->
...
残念ながら、elmが厳密な言語であるため、タスクが実行される前に高価な操作が評価されるため、機能しません。全体がまだブロックされている:( – doodledood
おそらくandThenトリックで試してみようか?Task.suceed 1 andThen \ _-> expensive' –
'andThen'の右側には、結果を返す関数ではなくTaskを返す関数が必要です:/このように私たちはそれから出ることができないようだよ – doodledood
エルムタスクは、事前に対応していません。 emptiveマルチタスキング。
Process.spawn
とすると、Task.andThen
の引数として使用されたときにコンテキストスイッチするタスクを構築できます。
しかし、これらの場合、結果のタスクのタイプがTask x Process.Id
であるという制約内で作業する必要があります。つまり、タスクの結果をメインアプリに簡単に伝達する手段がありません。
Process.Id
の場合はthe documentationを参照してください。
私は数日前にProcess.Idを使って実際に試しましたが、同じブロック効果を出すように見えました:( –
タスクはありませんDocsが言うように、 'Task.andThen'のスイッチ? –
現時点ではかなり役に立たず、まだブロックされています...このバージョンではできないようです – doodledood
https://github.com/rtfeldman/elm-web-workersのようなものを使用していますか? – Tosh
私ができるならば、私はむしろ別の方法を見つけることが現時点では厄介なようです。より複雑な種類のelmのみの文字列を渡すことはできません – doodledood