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一段时间。