2016-11-01 2 views
1

최근에 Hopac을 가지고 노는 것을 시작했는데 정말 멋지다고 생각합니다. 여기에 내 머리를 감쌀 수없는 문제가 있습니다.Hopac timeOutMillis가 예상대로 작동하지 않습니다.

let rnd = new Random() 

let logger (msg:string) = 
    let c = Ch<string>() 
    let msgLoop = job { 
     for i in [1..15] do 
      let msgStr = sprintf "%s %d" msg i 
      do! timeOutMillis (rnd.Next(1000,3000)) 
      do! c *<- msgStr 
    } 
    printfn "Started job %s" msg 
    msgLoop |> start 
    c 

let timeout = timeOutMillis 3000 

let c = logger "Instance Foo" 
let rec printLoop() = Job.delay <| fun() -> 
    Alt.choose[ 
      timeout ^=> fun() -> printfn "job timed out" 
            Job.result() 
      Ch.take c ^=> fun msg -> printfn "Log: %s" msg 
            printLoop() 
    ] 
printLoop() |> start 

3000 밀리 초는 시간 제한 대안을 사용할 수있게됩니다 및 인쇄 메시지를 중단됩니다 경과 후 나는 그것을 가정 : 아래는 코드입니다. 이것은 일어나지 않으며 채널에 아무 것도 남지 않는 경우에만 시간 초과가 시작됩니다. c

나는 여러 대안이 동시에 사용할 수있는 경우 문서에 따라 이후 처음 placein의 Alt.choose 목록에 어떤 도움이 (On the Semantics of Alternatives)

포착됩니다 목록에 처음으로 나타나는 하나를 타임 아웃을 배치 매우 높이 평가 됨

답변

1

빠른 답변입니다. 타임 아웃 라인에 시작되지 않은 :

let timeout = timeOutMillis 3000 

오히려 제한은 (재) 회선

timeout ^=> fun() -> printfn "job timed out" 

에 광고가 평가 될 때마다 시작. 프로그램에 대한 가장 짧은 수정은 시간 초과를 정의하는 행을 다음과 같이 변경하는 것입니다.

let timeout = timeOutMillis 3000 |> memo 
+0

감사합니다. 평가할 때마다 시간 초과가 다시 시작되는 일은 결코 없었습니다. 지금 매력으로 작동합니다. –

관련 문제