Jks*_*Liu 5 multithreading julia
Threads.@threads for i in [sth]
x = 123
...
end
Run Code Online (Sandbox Code Playgroud)
线程是x本地的。我找不到任何有关它的文件。
如果没有,我怎样才能获得本地线程。
假设这x是循环内的局部,那么是的。这是一个如何检查它的示例:
# julia -t 2 --banner=no
julia> Threads.@threads for i in 1:8
x = i
@info Threads.threadid(), i, x
sleep(rand())
@info Threads.threadid(), i, x
end
[ Info: (1, 1, 1)
[ Info: (2, 5, 5)
[ Info: (1, 1, 1)
[ Info: (1, 2, 2)
[ Info: (2, 5, 5)
[ Info: (2, 6, 6)
[ Info: (1, 2, 2)
[ Info: (1, 3, 3)
[ Info: (2, 6, 6)
[ Info: (1, 3, 3)
[ Info: (1, 4, 4)
[ Info: (2, 7, 7)
[ Info: (1, 4, 4)
[ Info: (2, 7, 7)
[ Info: (2, 8, 8)
[ Info: (2, 8, 8)
Run Code Online (Sandbox Code Playgroud)
对于每个线程,在循环体内传递的任何for带有注释的内容Threads.@threads都包装在匿名函数中。您可以使用@macroexpand函数来检查它。
请注意,它甚至更多x:在循环的每次迭代中获取一个新的绑定(这是 Julia 的标准行为——无论是单线程代码还是多线程代码,请参见此处)。
如果x不是循环内的局部变量,for则不再成立,如您在此处看到的:
# julia -t 2 --banner=no
julia> function f()
x = 1
Threads.@threads for i in 1:8
x = i
@info Threads.threadid(), i, x
sleep(rand())
@info Threads.threadid(), i, x
end
end
f (generic function with 1 method)
julia> f()
[ Info: (1, 1, 5)
[ Info: (2, 5, 5)
[ Info: (1, 1, 5)
[ Info: (1, 2, 2)
[ Info: (2, 5, 2)
[ Info: (2, 6, 6)
[ Info: (2, 6, 6)
[ Info: (2, 7, 7)
[ Info: (1, 2, 7)
[ Info: (1, 3, 3)
[ Info: (1, 3, 3)
[ Info: (1, 4, 4)
[ Info: (2, 7, 4)
[ Info: (2, 8, 8)
[ Info: (2, 8, 8)
[ Info: (1, 4, 8)
Run Code Online (Sandbox Code Playgroud)