核心1上不停计算x 核心2上不停取x的值
但没调试通 x没有共享 程序一直在核心1上循环 请大神指点 谢谢
using Distributed
using SharedArrays
x = SharedArray{Float64}(1, 1) #创建共享数组
addprocs(4)
@async (
fetch(
@spawnat 1 begin
while true
x[1] = x[1] + 5.0 #核心1上计算
# println("aaaa")
sleep(1)
end
end
)
)
@async (
fetch(
@spawnat 2 begin
while true
if (mod(fetch(x[1]),20.0)==0.0) #取核心1的计算结果
println(fetch(x[1]))
end
sleep(1)
end
end
)
)
你的代码只要改一处就能运行:先加进程再创建共享数组。你先建立数组再加进程怎么可能让 x
跑到还不存在的进程上。
这里指出其他问题:
- 你的代码是在用多进程而不是多线程
- 你把每个进程的创建放到了一个协程里,我不清楚你是否有特殊理由,但通常是多此一举。多进程是真并行,协程是假并行,根据需要二选一就行
我给出一个可用代码:
using Distributed
using SharedArrays
addprocs(1) #此例子中加一个就够了
x = SharedArray{Float64}(1) #创建共享数组
p1 = @spawnat 1 begin
while true
x[1] = x[1] + 5.0 #核心1上计算
# println("aaaa")
sleep(1)
end
end
p2 = @spawnat 2 begin
while true
#shared array 没有必要用fetch
if (mod(x[1],20.0)==0.0) #取核心1的计算结果
println(x[1])
end
sleep(1)
end
end
wait(p1) #阻塞,防止退出
另外,此处 shared array 不是最合适的(万一两个进程时间不够同步就乱了,sleep只能保证自己所在的句子的时间),应该用 remote channel。
请大神再具体指点。。。。。 我也在想sleep的问题 初学 实在不懂