Julia:在协程(任务)之间传递数据

时间:2014-04-22 01:15:19

标签: task coroutine julia

我试图让两个任务(协同程序)合作,但无济于事。以下是我所拥有的。我从来没有看到来自源或接收器功能的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")

1 个答案:

答案 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宏为你做了大部分工作。