REP中的@spawn和@async行为

时间:2015-05-21 09:41:37

标签: julia

我已阅读@async@spawn的{​​{3}},但未显示:

function f1(j)
    for i=1:j
       println(i*j)
    end
end

function f2(j)
    for i=1:j
       @spawn println(i*j)
    end
end

运行时,始终会同时使用@async@spawn

跳过第二个值
julia> f1(5)
5
10
15
20
25

julia> f2(5)
5

julia>
15
20
25

它似乎不会影响数据输出到数组(...或者它?),并且@sync f2(5)会恢复行为。大多只是想知道为什么会发生这种情况以及为什么会出现第二个值?

修改 它在两个系统上的行为如下:

julia> versioninfo()
Julia Version 0.4.0-dev+4850
Commit c260ea9* (2015-05-15 15:14 UTC)
Platform Info:
  System: Darwin (x86_64-apple-darwin13.4.0)
  CPU: Intel(R) Core(TM) i5-2415M CPU @ 2.30GHz
  WORD_SIZE: 64
  BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Sandybridge)
  LAPACK: libopenblas
  LIBM: libopenlibm
  LLVM: libLLVM-3.3

julia> versioninfo()
Julia Version 0.4.0-dev+4888
Commit ca2ca31* (2015-05-18 15:20 UTC)
Platform Info:
  System: Linux (x86_64-linux-gnu)
  CPU: AMD FX(tm)-8120 Eight-Core Processor
  WORD_SIZE: 64
  BLAS: libopenblas (NO_LAPACK NO_LAPACKE DYNAMIC_ARCH NO_AFFINITY Bulldozer)
  LAPACK: liblapack.so.3
  LIBM: libopenlibm
  LLVM: libLLVM-3.3

1 个答案:

答案 0 :(得分:1)

如果我每晚使用0.4,我也可以重现这个问题:

               _
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: http://docs.julialang.org
   _ _   _| |_  __ _   |  Type "help()" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.4.0-dev+5032 (2015-05-27 06:04 UTC)
 _/ |\__'_|_|_|\__'_|  |  Commit bae38c2* (0 days old master) 
|__/                   |  x86_64-apple-darwin13.4.0



julia> function f2(j)
                  for i=1:j
                     @spawn println(i*j)
                  end
              end
f2 (generic function with 1 method)

julia> f2(5)
5

julia>
15
20
25

版本0.3倾向于选择不同的时间,这种时间没有破坏性的竞争吸引到终端:

julia> f2(5)
510152025





julia> 

(这里,每个println都作为缓冲区打印和换行符与其他任务交错。)

0.4夜间输出看起来不完整的原因只是时间如何与终端处理换行符的方式相结合,移动到哑终端可以看到10:

$ TERM="dumb" ./julia-4
               _
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: http://docs.julialang.org
   _ _   _| |_  __ _   |  Type "help()" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.4.0-dev+5032 (2015-05-27 06:04 UTC)
 _/ |\__'_|_|_|\__'_|  |  Commit bae38c2* (0 days old master)
|__/                   |  x86_64-apple-darwin13.4.0

WARNING: Terminal not fully functional
julia> function f2(j)
           for i=1:j
               @spawn println(i*j)
           end
       end
f2 (generic function with 1 method)

julia> f2(5)
5

julia> 10
15
20
25

一般情况下,您可以指望通过@spawn@async执行的任何处理,您无法依靠任何共享资源的竞争对手如何运作。这种共享终端的情况就是一个例子。由异步/生成进程构建的任何共享数据结构都可以通过以任何顺序运行的计算和交错修改等来构建。

主要任务处理组织其他任务输出的示例可能如下所示:

function f3(j)
    x = Any[@spawn i*j for i=1:j]
    for i in x
       println(fetch(i))
    end
end

当然,如果i*j被高CPU使用率和/或等待I / O的原因替换reports,那么这只能很好地弥补移动数据的成本。比写入单个输出文件或TTY的瓶颈更重要。