在 Julia 怎麼用 async 跟 sync
這個問題在官方文件中並沒有詳細記載,所以覺得值得紀錄一下。
查閱 @async 的文件會講說,他會用一個 Task 把後面的表達式包裝起來,並且將他掛到排程器的佇列(queue)中。意思就是將表達式包裝成一個任務,並放到佇列中等待 CPU 核心的資源來執行他。
然而通常會搭配 @sync 來使用,@sync 的文件中提到,他會等到後面的 @async、@spawn、@spawnat 及 @distributed 都執行完畢。
使用情境比較像是(修改自這篇 stackoverflow)
1 | for (idx, pid) in enumerate(workers()) |
@sync 會等待這個 block 中的 @async 都執行結束才結束,@async 可以讓你指派一些非同步處理的任務,像是多執行緒或是多行程的平行運算。
@sync 就比較像 python 當中的 join()。