2016-08-19 1 views
4

J'ai un code très coûteux en calculs que j'ai besoin de lancer dans ma fonction 'update'.Concurrency dans Elm

Quand il fonctionne, mon application entière bloque jusqu'à ce qu'elle se termine.

Existe-t-il un moyen d'exécuter ce code de manière asynchrone pour empêcher le blocage? (sans utiliser les ports et rester dans l'orme)

+1

en utilisant quelque chose comme: https://github.com/rtfeldman/elm-web-workers? – Tosh

+0

Il semble un peu méchant en ce moment je préférerais trouver un autre moyen si je le pouvais. Vous ne pouvez pas passer les types les plus complexes d'orm uniquement les chaînes – doodledood

Répondre

0

Vous pouvez essayer de l'exécuter en tant que tâche. Les tâches peuvent être préventivement être arrêté pour exécuter d'autres parties de votre application, bien que je ne suis pas sûr comment ils vont travailler dans le cas de certains en utilisant la totalité de la capacité du processeur:

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

Malheureusement, cela ne fonctionne pas car l'opération coûteuse est évaluée avant l'exécution de la tâche car elm est un langage strict. Le tout bloque encore :( – doodledood

+0

Peut-être essayer avec un astuce etThen? Task.suceed 1 andThen \ _ -> cost' –

+0

Le côté droit de 'andThen' attend une fonction qui renvoie une tâche et non une fonction qui renvoie le résultat :/On dirait que nous ne pouvons pas en sortir de cette façon – doodledood

1

tâches Elm ne prennent pas en charge avant multitâche emptive.

Avec Process.spawn, vous pouvez construire des tâches qui basculeront vers le contexte lorsqu'elles seront utilisées comme arguments Task.andThen. Cependant, pour ceux-là, vous devez travailler dans la contrainte que la tâche résultante a le type Task x Process.Id, ce qui signifie qu'il n'y a pas de moyen facile de communiquer le résultat de votre tâche à l'application principale.

Voir the documentation pour Process.Id.

+0

J'ai effectivement essayé d'utiliser Process.Id il y a quelques jours, mais semblait donner le même effet de blocage :( –

+0

Cela ne fonctionne pas -switch à 'Task.andThen' comme le disent les docs? –

+1

Eh bien, c'est à peu près inutile pour le moment, et ça bloque encore ... On dirait que ça ne peut pas être fait dans cette version – doodledood