2014-07-27 17 views
6

Tôi không thể tìm thấy tài liệu chi tiết về macro @async. Từ các tài liệu về song song, tôi hiểu rằng chỉ có một luồng hệ thống được sử dụng bên trong một tiến trình Julia và có chuyển đổi nhiệm vụ rõ ràng đang diễn ra bởi sự giúp đỡ của hàm yieldto - sửa tôi nếu tôi sai về điều này.Julia: hiểu khi chuyển đổi nhiệm vụ xảy ra

Đối với tôi rất khó để hiểu chính xác khi nào các công tắc nhiệm vụ này xảy ra chỉ bằng cách xem mã và biết khi nào điều đó xảy ra có vẻ rất quan trọng.

Khi tôi hiểu một số yieldto ở đâu đó trong mã (hoặc trong một số hàm gọi là mã) cần phải có ở đó để đảm bảo rằng hệ thống không bị kẹt chỉ với một tác vụ.

Ví dụ: khi có hoạt động read, bên trong đọc có thể là cuộc gọi wait và trong quá trình triển khai wait có thể là cuộc gọi yieldto. Tôi nghĩ rằng nếu không có yieldto gọi mã sẽ bị kẹt trong một nhiệm vụ; tuy nhiên chạy ví dụ sau dường như chứng minh giả thuyết này sai.

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

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

Mã này xuất ra như sau

BA 
BA 
BA 
... 

Nó là rất rõ ràng với tôi, nơi các công việc chuyển đổi xảy ra bên trong nhiệm vụ tạo ra bởi các @async vĩ mô trong đoạn code trên.

Làm cách nào tôi có thể biết về việc xem xét một số mã mà các công việc chuyển đổi xảy ra ở đâu?

Trả lời

4

Công tắc chuyển đổi xảy ra bên trong cuộc gọi đến println("A"), tại một số điểm gọi write(STDOUT, "A".data). Bởi vì isa(STDOUT, Base.AsyncStream) và không có phương pháp đó là chuyên môn hóa hơn, điều này quyết tâm:

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

Nếu bạn nhìn vào phương pháp này, bạn sẽ thấy rằng nó gọi stream_wait(ct) vào các nhiệm vụ hiện tại ct, nó sẽ gọi wait().

(Cũng lưu ý rằng println không phải là nguyên tử, bởi vì có một tiềm năng wait giữa văn bản cho lập luận và xuống dòng.)

Bạn có thể dĩ nhiên xác định khi nào những thứ như điều đó xảy ra bằng cách nhìn vào tất cả mã có tính liên quan. Nhưng tôi không thấy lý do tại sao bạn sẽ cần phải biết điều này chính xác, bởi vì, khi làm việc với song song, bạn không nên phụ thuộc vào các quy trình không phải là chuyển đổi ngữ cảnh. Nếu bạn phụ thuộc vào một lệnh thực thi nào đó, hãy đồng bộ hóa một cách rõ ràng.

(Bạn đã lưu ý điều này trong câu hỏi của mình, nhưng hãy để tôi đặt lại ở đây: Theo nguyên tắc, khi sử dụng chủ đề màu xanh lá cây, bạn có thể mong đợi chuyển ngữ cảnh tiềm năng khi thực hiện IO, vì chặn IO là sách giáo khoa ví dụ về lý do tại sao các chủ đề màu xanh lá cây hữu ích ngay từ đầu.)

Các vấn đề liên quan