2014-04-22 4 views
7

두 작업 (coroutines)을 협조하려고했지만 아무 소용이 없었습니다. 아래는 내가 가지고있는 것입니다. 원본 또는 싱크 함수에서 printlns를 볼 수 없으며 wait() 호출이 영원히 중단 된 것으로 보입니다. 나는 또한 p (source) 태스크를 싱크 (as)를 인수로 넘겨주는 대신 글로벌 변수로 만들려고 시도했다. 그러나 그것은 sinke() 안에서 전역으로 선언 할 때도 작동하지 않는다.Julia : 코 루틴 (작업)간에 데이터 전달

이. 나는 또한() 함수를 소스 (내부 yieldto()를 호출)와 싱크 실험 한

내가 이동에서 채널 goroutines 매우 쉽게 할 수있는 발견 된 물건의 종류,하지만 난 여전히 교착 상태로 끝나는 것 같습니다.

이상적으로 데이터를 공유하는 여러 작업을 가진 사람이 있습니까? 이상적으로는 파이프 라인이나 긴 작업 체인이 있습니다.

도움을 미리 감사드립니다.

println("Hello") 

function source() 
    println("source start") 
    produce("start") 
    produce("stop") 
end 

function sink(p::Task) 
    println("sink start") 
    println(consume(p)) 
    println(consume(p)) 
end 


a = Task(source) 
b = Task(() -> sink(a) ) 

wait(b) 
wait(a) 

println("Goodbye") 

답변

7

줄리아에서 작성하는 작업은 자동으로 해당 작업을 예약하지 않습니다. 대기 함수가 예정되지 않으므로 교착 상태가 발생합니다. Go 문과 큰 차이가있어서 go 명령문이 모든 일정을 처리합니다. 줄리아에서는 좀 더 일을해야합니다. 특히 @sync 및 @async 매크로를 사용하면 을 쉽게 만들 수 있습니다.

@sync begin # @sync will wait for all the contained tasks to terminate. 
    a = @async source() # @async will create and schedule a task for you automatically 
    @async sink(a) 
end 

이 중 하나도 종료되지 않습니다. 모든 인쇄물이 나오지만 작업이 종료되지 않습니다. 원인은 작업 a가 완료되기를 기다리는 @sync이지만 작업 a는 예약되지 않았습니다. 최종 소비 또는 일정을 싱크 기능에 추가하여 작업 a를 예약하여 최종 종료 할 수 있도록합니다. 또는 더 나은 아직 작업에 대한 루프를 사용하여 항상 그것을 배기.

println("Hello") 

function source() 
    println("source start") 
    produce("start") 
    produce("stop") 
    println("source end") 
end 

function sink(p::Task) 
    println("sink start") 
    for s in p 
    println(s) 
    end 
    println("sink end") 
end 

@sync begin 
    a = @async source() 
    @async sink(a) 
end 

println("Goodbye") 

줄리아의 작업은 협력 기본적으로 각 작업은 자신이 계획됩니다 확인해야 의미 예정이다. 런타임은 당신을 위해 그것을하지 않을 것입니다. 다행히 @sync 매크로와 @async 매크로가 대부분을 담당합니다.

+0

좋아요! 분명한 대답을 주셔서 감사합니다. 나는 줄리아가 코 루틴보다 훨씬 세밀하게 제어 할 수 있음을 알 수 있습니다. 도와 주셔서 감사합니다. –