2014-04-22 25 views
7

Ben işbirliği iki görevi (eşyordamlar) almak için çalıştık (görevleri) geçerek ama boşuna. Aşağıda sahip olduğum şey. Yazdırma kaynaklarını hiçbir zaman kaynak veya havuz işlevlerinden göremiyorum ve wait() çağrısı sonsuza kadar asılıyormuş gibi görünüyor. Ben bunun yerine bir argüman olarak() batmaya geçme, s (kaynak) görev global değişken hale denedi, ama bu ya (ben global olarak Sinke() içine ilan bile işe görünmüyor.Julia: değiş tokuş eden kavramlar arasında veri

Bu. Ben de) (işlevlerini kaynağı (iç yieldto() çağırarak) ve lavabo ile denemişlerdir

ben git kanalları ve goroutines ile çok kolayca yapabilirsiniz keşfetti şey türüdür, ama ben hala çıkmazla görünmektedir.

herhangi bir şekilde veri paylaşımı çoklu görevlerin bir örnekle

herkes? İdeal olarak, ben bir boru hattı veya görevlerin uzun bir zincir olurdu.

Yardımlarınız için şimdiden teşekkür ederiz.

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") 

cevap

7

Julia'da bir görev oluşturmak bu görevi otomatik olarak zamanlamaz. Bekleme işlevi ya zamanlama yapmaz, böylece bir kilitlenme ile sonuçlanırsınız. Bu, go ifadesinin sizin için tüm zaman planlamasının yapıldığı Go'dan büyük bir farktır. Julia’da biraz daha iş yapmalısın. Özellikle daha kolay yapmak için @sync ve @async makroları kullanabilirsiniz.

@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 

Bunun da sonlandığını fark edersiniz. Tüm baskılar gerçekleşir ama görev sonlandırılmaz. Bunun nedeni, @sync'nin görev a bitmesini beklemek ama görev a planlanmamış. Görev a son kez planlanan bir son zaman elde etmek için zorlamak için son işlevini veya havuz işlevine zamanlama ekleyin. Ya da daha iyisi görev için bir döngü kullanın, böylece her zaman tüketirsiniz.

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") 

Julia'nın görevleri işbirliği temelde her görev kendiniz planlanan alır sağlamak zorunda anlamına gelir yapılmaktadır. Çalışma zamanı sizin için yapmayacak. Neyse ki @sync ve @async makroları sizin için bunun çoğunu yapıyor.

+0

Büyük! Açık cevap için teşekkürler. Julia'nın koroutinler üzerinde çok daha iyi bir kontrol sağladığını görebiliyorum. Yardımın için minnettarım. –