如何在Julia中同时运行两个功能?

时间:2019-10-29 05:08:26

标签: multiprocessing julia

我正在尝试在julia中同时运行两个功能,但是我不知道该怎么做。在这里您可以看到我的代码:

function area(side::Float64)
    return side*side
end

function f(n::Int64)
    mat = zeros(n,n)
    for i=1:n
        for j=1:n
            mat[i,j] = area(rand())
        end
    end
    return mat
end

function g(n::Int64)
    mat = zeros(n,n)
    for i=1:n
        for j=1:n
            mat[i,j] = area(rand()*rand())
        end
    end
    return mat
end

s1 = f(10)
s2 = g(10)
hcat(s1,s2)

2 个答案:

答案 0 :(得分:5)

在Julia 1.3中,您可以使用Threads.@spawn生成将在不同线程上安排的任务:

begin
s1 = Threads.@spawn f(10)
s2 = Threads.@spawn g(10)
s1 = fetch(s1)
s2 = fetch(s2)
end

有关更多信息,请参见公告博客文章:https://julialang.org/blog/2019/07/multithreading

答案 1 :(得分:4)

通常,并行计算中有不同的“同时”概念。

由于您将问题标记为“多处理”,因此让我为您提供一个简单的多进程解决方案(该方法适用于任何Julia版本> = 0.7的情况)。因此,它利用了Julias内置的Distributed计算工具。

using Distributed
nworkers() < 2 && addprocs(2) # add two worker processes if necessary

@everywhere begin # define your functions on both workers
    area(side::Float64) = side*side

    function f(n::Int64)
        mat = zeros(n,n)
        for i=1:n
            for j=1:n
                mat[i,j] = area(rand())
            end
        end
        return mat
    end

    function g(n::Int64)
        mat = zeros(n,n)
        for i=1:n
            for j=1:n
                mat[i,j] = area(rand()*rand())
            end
        end
        return mat
    end
end

# spawn tasks on the two workers (non-blocking)
t1 = @spawn f(10)
t2 = @spawn g(10)

# fetch the results (blocking until workers have finished)
r1 = fetch(t1)
r2 = fetch(t2)
hcat(r1,r2)

有关如何使用Distributed进行并行计算结帐的更多信息,例如this part of the Julia documentation或我的一个讲习班Parallel Computing in Julia中的Jupyter讲习班。