我试图让两个任务(协同程序)合作,但无济于事。以下是我所拥有的。我从来没有看到来自源或接收器功能的printlns,并且wait()调用似乎永远挂起。我也尝试将p(源)任务作为一个全局变量,而不是将其作为参数传递给sink(),但这似乎也不起作用(即使我在sinke()中将其声明为全局变量。 / p>
这是我发现我可以很容易地使用Go中的频道和goroutines做的事情。
我还尝试在source()和sink()函数中调用yieldto(),但我似乎仍然陷入僵局。
任何有多个任务示例的人以任何方式共享数据?理想情况下,我会有一个管道或长链任务。
提前感谢您的帮助。
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")
答案 0 :(得分:7)
在Julia中,创建任务不会自动安排该任务。等待函数不会安排任何一个,所以你最终会遇到死锁。这与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
你注意到,这并没有终止。所有打印都会发生,但任务不会终止。原因是@sync等待任务a完成但任务a尚未安排。将最终消耗或计划添加到接收器功能以强制任务a最后一次计划,以便它可以终止。或者更好的是在任务上使用for循环,这样你总是把它耗尽。
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的任务是合作安排的,这基本上意味着你必须确保每个任务都由你自己安排。运行时不会为你做这件事。幸运的是,@ sync和@async宏为你做了大部分工作。