Asynchronous 朱莉娅:了解任务切换的时间

Asynchronous 朱莉娅:了解任务切换的时间,asynchronous,julia,Asynchronous,Julia,我找不到有关@async宏的详细文档。从关于并行性的文档中,我了解到Julia进程中只使用了一个系统线程,并且在yieldto函数的帮助下进行了明确的任务切换-如果我在这方面有错误,请纠正我 对我来说,仅仅通过查看代码就很难理解这些任务切换到底是在什么时候发生的,而知道何时发生似乎至关重要 据我所知,yieldto代码中的某个地方(或代码调用的某个函数中)需要存在,以确保系统不会只执行一项任务 例如,当有一个read操作时,在read内部可能有一个wait调用,在wait的实现中可能有一个yie

我找不到有关
@async
宏的详细文档。从关于并行性的文档中,我了解到Julia进程中只使用了一个系统线程,并且在
yieldto
函数的帮助下进行了明确的任务切换-如果我在这方面有错误,请纠正我

对我来说,仅仅通过查看代码就很难理解这些任务切换到底是在什么时候发生的,而知道何时发生似乎至关重要

据我所知,
yieldto
代码中的某个地方(或代码调用的某个函数中)需要存在,以确保系统不会只执行一项任务

例如,当有一个
read
操作时,在read内部可能有一个
wait
调用,在
wait
的实现中可能有一个
yieldto
调用。我认为如果没有
yieldto
调用,代码将停留在一个任务中;然而,运行下面的示例似乎证明了这个假设是错误的

@async begin # Task A
    while true
        println("A")
    end    
end

while true # Task B
  println("B")
end
此代码生成以下输出

BA
BA
BA
...
我不清楚任务切换发生在上面代码中由
@async
宏创建的任务内部的什么地方


我如何判断查看某些代码时任务切换发生的点?

任务切换发生在对
println(“A”)
的调用中,该调用在某些点调用
write(STDOUT,“A”.data)
。由于
isa(STDOUT,Base.AsyncStream)
并且没有更专门化的方法,因此解决方法如下:

write{T}(s::AsyncStream,a::Array{T}) at stream.jl:782
如果查看此方法,您会注意到它在当前任务
ct
上调用
stream\u wait(ct)
,而当前任务又调用
wait()

(还要注意,
println
不是原子的,因为在写入参数和换行符之间有一个潜在的
wait
。)

当然,您可以通过查看所有涉及的代码来确定这样的事情何时发生。但我不明白为什么您需要确切地了解这一点,因为在处理并行性时,您不应该依赖于不切换上下文的进程。如果依赖于某个执行顺序,请显式同步

(您在问题中已经注意到了这一点,但让我在这里重申一下:根据经验,当使用绿色线程时,在执行IO时,您可能会遇到潜在的上下文切换,因为阻止IO是一个教科书式的例子,说明了为什么绿色线程首先是有用的。)