Mục đích của đồng bộdispatch_apply
là không đồng bộ gửi các giao diện vòng lặp bên trong tới các tài nguyên xử lý song song có sẵn. Do đó, hiệu suất vòng lặp tổng thể có thể tăng tốc.
Hiệu suất vòng lặp nhanh hơn? Rất có thể, Vâng. (xem caveat)
Chặn chuỗi gọi dispatch_apply
? Có, giống như các khối vòng lặp cho đến khi hoàn thành.
Đối với GCD, dispatch_apply
là đồng bộ từ dispatch_apply
sẽ không trở lại cho đến khi tất cả các không đồng bộ, song song nhiệm vụ mà dispatch_apply
tạo đã hoàn thành.
Tuy nhiên, mỗi công việc cá nhân enqueued bởi dispatch_apply
thể chạy như đồng thời không đồng bộ nhiệm vụ nếu mục tiêu queue
là không đồng bộ.
Ví dụ trong Swift:
let batchCount: Int = 10
let queue = dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)
dispatch_apply(batchCount, queue) {
(i: Int) -> Void in
print(i, terminator: " ")
}
print("\ndispatch_apply QOS_CLASS_UTILITY queue completed")
mang lại sản lượng không có thứ tự như sau:
0 8 1 9 2 3 4 5 6 7
dispatch_apply QOS_CLASS_UTILITY queue completed
Vì vậy, dispatch_apply
đồng bộ khối khi gọi, nhưng "hàng loạt" nhiệm vụ tạo ra bởi dispatch_apply
có thể chạy đồng thời, không đồng bộ, song song với nhau.
Lưu ý rằng ...
công việc thực hiện trong mỗi lần lặp là khác biệt từ công việc thực hiện trong tất cả các lần lặp khác, và thứ tự mà mỗi vòng lặp liên tiếp hoàn thành là không quan trọng
Ngoài ra, lưu ý rằng sử dụng một hàng đợi nối tiếp cho các nhiệm vụ vòng lặp bên trong sẽ không có bất kỳ lợi ích hiệu suất nào.
Mặc dù sử dụng một hàng đợi nối tiếp được phép và làm điều đúng đắn cho mã của bạn, sử dụng một hàng đợi như vậy đã không có ưu điểm hiệu suất thực trên rời khỏi vòng lặp tại chỗ.
Awesome, đó chính xác là những gì tôi muốn làm. Cảm ơn. – Jessica