2016-08-19 3 views
4

필자는 '업데이트'기능을 실행하는 데 필요한 계산량이 많은 코드가 있습니다.Elm의 동시성

실행하면 내 전체 응용 프로그램이 끝날 때까지 차단됩니다.

차단을 방지하기 위해이 코드를 비동기 적으로 실행할 수있는 방법이 있습니까? (포트를 사용하지 않고 느릅 나무에 머무르는 동안)

+1

같은 것을 사용 : https://github.com/rtfeldman/elm-web-workers? – Tosh

+0

내가 할 수만 있다면 다른 방법을 찾고 싶다. 보다 복잡한 유형의 느릅 나무 만 문자열을 전달할 수 없습니다. – doodledood

답변

0

작업으로 실행 해 볼 수 있습니다.

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

느릅 나무 작업은 사전 지원하지 않습니다 : 나는 그들이 CPU 용량의 전체를 사용하여 일부의 경우에 작동하는 방법을 확실 해요하지만 작업 선제 적으로, 응용 프로그램의 다른 부분을 실행 중지 될 수 있습니다 emptive 멀티 태스킹.

Process.spawn을 사용하면 Task.andThen의 인수로 사용될 때 컨텍스트 전환 작업을 구성 할 수 있습니다.

그러나 이러한 경우 결과 작업의 유형이 Task x Process.Id 인 제약 조건 내에서 작업해야합니다. 즉, 작업 결과를 주 앱에 다시 전달하는 쉬운 방법이 없음을 의미합니다.

Process.Id의 경우 the documentation을 참조하십시오.

+0

며칠 전 Process.Id를 사용하여 실제로 시도했지만 동일한 차단 효과를내는 것처럼 보였습니다. ( –

+0

작업이 없습니다 Docs가 말한 것처럼'Task.andThen'에서 스위치를 사용 하시겠습니까? –

+1

글쎄, 지금은 거의 쓸모가 없습니다. 여전히 블록됩니다 ...이 버전에서는 할 수없는 것처럼 보입니다. – doodledood