2014-07-27 38 views
6

我無法找到有關@async宏的詳細文檔。從關於並行性的文檔中我知道在Julia進程中只有一個系統線程,並且在yieldto函數的幫助下正在進行明確的任務切換 - 如果我對此有錯,請糾正我的錯誤。Julia:瞭解何時發生任務切換

對於我來說,僅僅通過查看代碼並知道它何時發生似乎非常重要,對於我來說很難理解這些任務切換何時發生。

據我瞭解yieldto代碼中的某處(或在代碼調用的某些函數中)需要在那裏以確保系統不會被卡住只有一個任務。

例如,當存在read操作時,在讀取內部可能有wait調用,並且在執行wait時可能有yieldto調用。我認爲沒有yieldto的調用,代碼就會停留在一個任務中;然而運行下面的例子似乎證明了這個假設是錯誤的。

@async begin # Task A 
    while true 
     println("A") 
    end  
end 

while true # Task B 
    println("B") 
end 

此代碼產生以下輸出

BA 
BA 
BA 
... 

這是非常不清楚我在哪裏,在上面的代碼中@async宏創建任務內的任務切換髮生。

我該如何看看某些代碼中發生任務切換的點?

回答

4

任務切換髮生在println("A")的調用中,在某些時候調用write(STDOUT, "A".data)。由於isa(STDOUT, Base.AsyncStream)並沒有什麼方法是比較專業的,被解析爲:

write{T}(s::AsyncStream,a::Array{T}) at stream.jl:782 

如果你看一下這個方法,你會發現,它的當前任務ct,進而調用wait()調用stream_wait(ct)

(另請注意,println也不是原子的,因爲寫的論點和新行之間的潛在wait

你當然可以決定什麼時候這樣的事情發生通過查看所有代碼參與其中。但我不明白你爲什麼需要知道這一點,因爲在處理並行性時,無論如何都不應該依賴進程而不是切換上下文。如果您依賴某個執行順序,則顯式同步。作爲一個經驗法則,當使用綠色線程時,您可以預期在執行IO時潛在的上下文切換,因爲阻止IO是一本教科書爲什麼綠色線程首先是有用的例子。)