Tôi có đoạn mã sau (giản thể):Nested Async/chờ đợi Không xuất hiện để được Scaling
public async Task GetData(DomainObject domainObject, int depth)
{
// This async operation is really quick, and there's usually like five.
IEnumerable<TierOne> tierOnes = await domainObject.GetTierOnesAsync();
var tierOneTasks = tierOnes.Select(async tierOne =>
{
// This async operation is really quick and there's usually like three.
IEnumerable<TierTwo> tierTwos = await tierOne.GetTierTwosAsync();
if (depth <= TierTwoDepth)
return;
var tierTwoTasks = tierTwos.Select(async tierTwo =>
{
// This async operation is usually fast, and there's usually >= 100.
IEnumerable<TierThree> tierThrees = await tierTwo.GetTierThreesAsync();
if (depth <= TierThreeDepth)
return;
var tierThreeTasks = tierThrees.Select(async tierThree =>
{
// This async operation is SLOW, and there's usually.. 50?
await tierThree.GetTierFoursAsync();
});
await Task.WhenAll(tierThreeTasks.ToArray());
});
await Task.WhenAll(tierTwoTasks.ToArray());
});
await Task.WhenAll(tierOneTasks.ToArray());
}
Dựa tắt của những gì tôi đã nhìn thấy, nó dường như không được mở rộng quy mô rất tốt. Tất cả các hoạt động Async
là các hoạt động "không đồng bộ đúng" có nghĩa là tất cả chúng đều là I/O.
Tôi có sử dụng Async/Await không chính xác cho trường hợp này không? Dựa trên quan sát hiện tại của tôi, nó không phải là quy mô để những gì tôi mong đợi. Liệu TPL DataFlow có phải là giải pháp của tôi không?
"có vẻ như đang mở rộng quy mô" là lỗi chính tả và bạn muốn đặt một 'không' trong đó? Và nếu vậy, mở rộng quy mô theo cách nào, bạn có hy vọng nó sẽ hoàn thành nhanh hơn hay chỉ không tải quá nhiều vào hệ thống? Bạn thử nghiệm tỉ lệ như thế nào? –
Bạn đang sử dụng rất nhiều 'IEnumerables' làm giá trị trả về không đồng bộ. Bạn có chắc chắn rằng trì hoãn exectution không can thiệp với parallelisation giả định của bạn? – nvoigt
@ScottChamberlain Vâng, đó là lỗi đánh máy. Tôi hy vọng nó sẽ kết thúc nhanh hơn. Tôi hiểu rằng nó sẽ chỉ hoạt động nhanh khi kết thúc hoạt động không đồng bộ của tôi sẽ được xử lý. Có vẻ như nếu tôi tăng lên 1500 nhiệm vụ, tôi mong đợi nhiều hơn chỉ 3 hoặc 4 bị kẹt trong phần 'Đang chờ' của máy trạng thái. (Xin lỗi nếu điều này không có ý nghĩa gì. Nó trễ ở đây, và tôi rất buồn ngủ.) – Cameron