在 Julia 中与 @sync @async 并行

Parallelism with @sync @async in Julia

我有一些很重的 csv table,我想将其与 @sync @sync 宏并行导入。 对这个不是很熟悉,我试过这样:

#import files
@sync @async begin
    df1=CSV.File(libname*"df1.csv")|> DataFrame!
    df2=CSV.File(libname*"df2.csv")|> DataFrame!
end

我已经完成了任务,但是我之后制作的数据子集似乎受到了影响:

select!(df1, Not("Var1"))

ArgumentError : Column :Var1 not found in the data frame

PS :没有 @sync 宏代码运行良好

我可能做错了什么。任何想法都会有所帮助。 谢谢

@sync @async 除了引入一个 begin...end 块及其本地作用域外,不要在代码中做任何事情。

这里发生的是您正在创建一个新范围并且从不修改 df1df2 的全局值 - 而不是您看到的是它们的旧值。

如果 I/O 是您代码中的瓶颈,正确的代码如下:

dfs = Vector{DataFrame}(undef, 2)
@sync begin
    @async dfs[1]=CSV.File(libname*"df1.csv")|> DataFrame!
    @async dfs[2]=CSV.File(libname*"df2.csv")|> DataFrame!
end

但是,问题通常不是 I/O,而是 CPU。在这种情况下,绿色线程并没有多大用处,您需要普通的常规线程:

dfs = Vector{DataFrame}(undef, 2)
Threads.@threads for i in 1:2
    dfs[i]=CSV.File(libname*"df$i.csv")|> DataFrame!
end

请注意,要使此代码使用 multi-threading,您需要在 运行 Julia 之前设置 JULIA_NUM_THREADS 系统变量,例如:

set JULIA_NUM_THREADS=2