gpt4 book ai didi

asynchronous - Julia:了解何时发生任务切换

转载 作者:行者123 更新时间:2023-12-04 04:05:11 25 4
gpt4 key购买 nike

我找不到有关 @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

如果你查看这个方法,你会注意到它调用了 stream_wait(ct)关于当前任务 ct ,反过来调用 wait() .

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

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

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

关于asynchronous - Julia:了解何时发生任务切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24976617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com