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

Ric*_*mer 7 task coroutine julia

我试图让两个任务(协同程序)合作,但无济于事.以下是我所拥有的.我从来没有看到来自源或接收器功能的printlns,并且wait()调用似乎永远挂起.我也尝试将p(源)任务作为一个全局变量,而不是将它作为参数传递给sink(),但这似乎也不起作用(即使我在sinke()中将其声明为全局变量.

这是我发现我可以通过Go中的频道和goroutine轻松完成的事情.

我还尝试在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")
Run Code Online (Sandbox Code Playgroud)

Jer*_*all 7

在Julia中,创建任务不会自动安排该任务.wait函数不会安排任何一个,所以你最终会遇到死锁.这与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
Run Code Online (Sandbox Code Playgroud)

你会注意到,这也不会终止.所有打印都会发生,但任务不会终止.原因是@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")
Run Code Online (Sandbox Code Playgroud)

Julia的任务是合作安排的,这基本上意味着你必须确保每个任务都由你自己安排.运行时不会为你做这件事.幸运的是,@ sync和@async宏为您完成了大部分工作.