這個問題在官方文件中並沒有詳細記載,所以覺得值得紀錄一下。

查閱 @async 的文件會講說,他會用一個 Task 把後面的表達式包裝起來,並且將他掛到排程器的佇列(queue)中。意思就是將表達式包裝成一個任務,並放到佇列中等待 CPU 核心的資源來執行他。

然而通常會搭配 @sync 來使用,@sync 的文件中提到,他會等到後面的 @async@spawn@spawnat@distributed 都執行完畢。

使用情境比較像是(修改自這篇 stackoverflow

1
2
3
@sync for (idx, pid) in enumerate(workers())
@async a[idx] = remotecall_fetch(do_something, pid, 2)
end

@sync 會等待這個 block 中的 @async 都執行結束才結束,@async 可以讓你指派一些非同步處理的任務,像是多執行緒或是多行程的平行運算。

@sync 就比較像 python 當中的 join()