Asynchronous 如何在Julia中度量函数的@async运行时?

Asynchronous 如何在Julia中度量函数的@async运行时?,asynchronous,julia,Asynchronous,Julia,我的代码如下: function getImages() @async for i in 1:30 load("path/to/image$i.jpg"); end end @time @sync getImages() 在Julia中,这是度量异步运行时的正确方法吗?我不想相信这一点,因为在同步运行中,需要0.1秒才能完成,@async代码只显示0.000017秒。您的直觉就在这里!简而言之,您没有正确使用@sync 引用以下文件:

我的代码如下:

function getImages()
    @async for i in 1:30
        load("path/to/image$i.jpg");
    end
end
   
@time @sync getImages()

在Julia中,这是度量异步运行时的正确方法吗?我不想相信这一点,因为在同步运行中,需要0.1秒才能完成,@async代码只显示0.000017秒。

您的直觉就在这里!简而言之,您没有正确使用
@sync

引用以下文件:

等待@async、@spawn、@spawnat和@distributed的所有词汇封闭的使用完成。收集封闭异步操作引发的所有异常,并将其作为CompositeException引发

在这里,
@async
@sync
表达式中不是词汇性的。实际上,
@sync
宏中没有魔法。
@async
@spawn
@spawnat
@distributed
表达式将创建任务。而
@sync
只需等待它们完成

因此,您可以手动执行以下操作:

julia> f() = @async sleep(1)

julia> @time wait(f())
  1.002095 seconds (9 allocations: 848 bytes)

您需要稍微重新组织代码

julia> function getImages()
           @sync for i in 1:30
               @async begin
                   sleep(rand())
                   println("Image ", i)
               end
           end
       end
getImages (generic function with 1 method)

julia> @time getImages()
Image 2
Image 5
Image 15
Image 30
Image 4
Image 7
Image 20
Image 3
Image 22
Image 18
Image 11
Image 29
Image 9
Image 24
Image 16
Image 6
Image 8
Image 14
Image 19
Image 21
Image 13
Image 1
Image 17
Image 10
Image 27
Image 25
Image 23
Image 28
Image 26
Image 12
  0.894566 seconds (650 allocations: 37.406 KiB)

以下是正确的代码:

function getImages()
    myimages = Vector{Any}(undef, 30) 
    # instead of Any use the correct type of whatever your load returns
    @sync for i in 1:30
        @async myimages[i] = load("path/to/image$i.jpg");
    end
    myimages 
end   
当IO速度较慢时,此方法非常有用。 但是请注意,这个coode将只使用一个线程。因此,如果IO不是您的性能瓶颈,那么这种并行化将不会有帮助。在这种情况下,你应该考虑使用线程。

开始Julia run之前:

set JULIA_NUM_THREADS=4
或者在Linux上

export JULIA_NUM_THREADS=4
并将您的功能更改为:

function getImages()
    myimages = Vector{Any}(undef, 30) 
    # instead of Any use the correct type of whatever your load returns
    Threads.@threads for i in 1:30
        myimages[i] = load("path/to/image$i.jpg");
    end
    myimages 
end

谢谢你的回答!!但是你能在我的密码里显示出来吗?我尝试了每种组合,但它仍然按顺序打印数字。但这是另一个问题。我猜您是想使用它,但如果我再次使用load(“image.jpg”)而不是sleep(rand()),它会按顺序打印。这就是我们在阅读文件时应该期待的吗?普泽米斯劳·苏费尔在上面的回答中回答了这个问题
@async
本身并不并行运行,而是并行运行。这意味着,该函数可以将控制权让给另一个函数,通过这种方式,可以在同一线程上运行多个进程,100%使用CPU。例如,若您正在从网络下载数据,那个么这是有意义的:当进程等待服务器响应时,它可以将控制权让给另一个进程,该进程可以发送另一个请求。但是对于
load
操作来说,它似乎不是这样的,因为它100%的时间都在使用整个线程。非常感谢!我按照你在
@线程上说的做了
代码,但是我得到了一个我通常不会得到的错误<代码>致命错误:错误:LoadError:TaskFailedException:检测到并发冲突您的
加载
函数可能不是线程安全的(例如,依赖函数调用之间共享的内部状态或缓冲区)。在这种情况下,您将无法对其执行多线程操作(除非您将其修改为线程安全)。在这种情况下,您仍然可以查看
分布式
。非常感谢您的帮助。我想我会坚持使用@distributed一段时间。