我没有明确了解内部结构或特定实现,这是我个人的有根据的猜测,很高兴由实际的 julia 开发人员纠正,但我认为任务本身并不是共享“当前目录”的情况,但是他们更普遍地共享“状态”。您的示例将与全局变量的行为方式相同:
# in testscript.jl
var = 0;
function runme(val)
global var = val+1;
return t = @async begin
sleep(1)
println(val,"::",var);
end
end
runme(1)
runme(3)
# in the REPL session
julia> include("testo.jl");
1::4
3::4
然而,(全局)状态的共享是一个功能,而不是一个错误。这与流程(这是 Julia 实现真正并行性的方式),它们不共享状态,因此工作人员之间的所有通信都需要通过套接字完成。
虽然人们确实需要小心这一点,但它也可能非常有用和必要。任务(或协程)不用于实现这方面的并行性或限制。它们是“协作多任务处理的一种形式”,即一种在同一线程上实现多个运行操作的方法;这不是并行性,多个操作“在 CPU 的监督下,通过适当的调度一次运行一个”。例如,“try/catch”块(显然)是使用任务实现的。
因此,要回答您的第一个问题,是的,您需要了解共享状态,而对于第二个问题,不,只要您以某种方式访问全局状态(其中当前目录是一个方面)我不完全确定每个任务应该按照您描述的方式有自己的语义;相反,您只需要以这样的方式设计您的任务,使它们考虑到状态共享的事实,并采取相应的行动。
作为第二个的另一个例子,考虑两个单独的任务,它们“产生”需要“消耗”的输出。如果您依赖于基于全局状态的任一任务的适当消耗,那么您的任务完全有可能在设计上应根据共享全局状态进行适当的行为。这是一个简单的例子:
d = 0;
function report()
global d;
for i in 1:4
if iseven(d); produce("D is Even\n"); else; produce("D is Odd\n"); end
end
end
task1 = Task( report );
task2 = Task( report );
for i in 1:4
d = i;
consume(task1) |> print;
consume(task2) |> print;
end
D is Odd
D is Odd
D is Even
D is Even
D is Odd
D is Odd
D is Even
D is Even
PS. the latest julia build is informing me that "produce" and "consume" are being deprecated in favour of "Channels", but presumably the point stands.