Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 在Julia中使用@sync@async实现简单并行_Asynchronous_Parallel Processing_Async Await_Julia - Fatal编程技术网

Asynchronous 在Julia中使用@sync@async实现简单并行

Asynchronous 在Julia中使用@sync@async实现简单并行,asynchronous,parallel-processing,async-await,julia,Asynchronous,Parallel Processing,Async Await,Julia,我有一个问题,我想并行执行一些相互独立的语句 我已经阅读了大量的例子,建议这个玩具的例子应该工作: function f1(x,y,z) @sync @async begin # these two statements can be computed independently v1 = x+y; v2 = y+z; end return v1*v2 end 但是,@sync部分似乎没有等待结果完成,因为我得到了以下错误: y1 = f1(1,2,3);

我有一个问题,我想并行执行一些相互独立的语句

我已经阅读了大量的例子,建议这个玩具的例子应该工作:

function f1(x,y,z)
  @sync @async begin
    # these two statements can be computed independently
    v1 = x+y; 
    v2 = y+z;
  end
  return v1*v2
end
但是,@sync部分似乎没有等待结果完成,因为我得到了以下错误:

y1 = f1(1,2,3);
ERROR: LoadError: UndefVarError: v1 not defined
我已成功地使其工作如下:

function f2(x,y,z)
  v1 = @async x+y;
  v2 = @async y+z;
  return wait(v1)*wait(v2)
end
然而,在我看到的许多示例中,如果使用@sync块,wait语句似乎是不必要的

我用的是Julia 0.6.2


任何帮助都将不胜感激。

原因是
@async
会围绕传递给它的表达式创建一个闭包。您可以通过运行以下命令查看它:

julia> @macroexpand @async begin
       v1 = x+y;
       v2 = y+z;
       end
:((Base.async_run_thunk)((()->begin  # task.jl, line 335:
                begin  # REPL[22], line 2:
                    v1 = x + y # REPL[22], line 3:
                    v2 = y + z
                end
            end)))
这意味着
v1
v2
变量在闭包外不可见,除非它们出现在封闭函数范围内

要解决此问题,可以在
f1
开头添加
localv1、v2
语句:

julia> function f1(x,y,z)
           local v1, v2
           @sync @async begin
               v1 = x+y;
               v2 = y+z;
           end
           return v1*v2
       end
f1 (generic function with 1 method)

julia> f1(1,2,3)
15
正如你所看到的,一切都按预期进行

此外,如果封闭范围不是函数而是全局范围,则必须使用
global
关键字来获取所需内容:

julia> x,y,z = 1,2,3
(1, 2, 3)

julia> @sync @async begin
          global v1 = x+y;
          global v2 = y+z;
       end
Task (done) @0x0000000018be30f0

julia> v1*v2
15