2016-08-26 36 views
5

Tôi đã đọc Dataflow (Task Parallel Library), và có một phần mà nói:Hiểu TPL Dataflow mức độ song song đặt hàng

Khi bạn chỉ định một mức độ tối đa song song đó là lớn hơn 1, nhiều tin nhắn được xử lý cùng một lúc, và do đó, các tin nhắn có thể không được xử lý theo thứ tự mà chúng được nhận. Tuy nhiên, thứ tự mà thông điệp được xuất ra từ khối sẽ được sắp xếp một cách chính xác.

Điều đó có nghĩa là gì?

Ví dụ, tôi đặt khối hành động của tôi với mức độ song song = 5:

testActionBlock = new ActionBlock<int>(i => Consumer(i), 
      new ExecutionDataflowBlockOptions() 
      { 
       MaxDegreeOfParallelism = 5 
      }); 

await Producer(); 
testActionBlock.Completion.Wait(); 

Nhà sản xuất của tôi() số cơ bản hàng đợi vào khối:

private async Task Producer() 
{ 
    for (int i=0; i<= 1000; i++) 
    { 
     await testActionBlock.SendAsync(i); 
    } 
    testActionBlock.Complete(); 
} 

Và tiêu dùng của tôi (i) chỉ viết ra các dòng:

private async Task Consumer(int i) 
{ 
    if (i == 1) 
    { 
     await Task.Delay(5000); 
    } 
    Console.WriteLine(i); 
} 

Điều đó có nghĩa là người tiêu dùng (2) sẽ bị chặn cho đến khi người tiêu dùng (1) ha s hoàn thành chế biến (vì có một sự chậm trễ 5 giây)? Tôi đã thử nghiệm mã và nó không có vẻ như vậy. Ngay cả khi tôi đã gỡ bỏ độ trễ 5 giây, tôi không thấy đầu ra theo thứ tự.

[Cập nhật]

bBlock = new BufferBlock<int>(option); 

testActionBlock = new ActionBlock<int>(i => Consumer(i), 
    new ExecutionDataflowBlockOptions() 
    { 
     MaxDegreeOfParallelism = 5 
    }); 

bBlock.LinkTo(testActionBlock); 

await Producer(); 
testActionBlock.Completion.Wait(); 

My Nhà sản xuất() bây giờ sẽ thêm vào bBlock:

private async Task Producer() 
{ 
    for (int i=0; i<= 1000; i++) 
    { 
     await bBlock.SendAsync(i); 
    } 
    bBlock.Complete(); 
} 

Vì vậy, trong trường hợp này, người tiêu dùng (1) sẽ chờ đợi trong vòng 5 giây, trước khi người tiêu dùng (2) có thể tiến hành?

Trả lời

3

số DoP bạn có thể nghĩ như đề (Không chính xác nhưng cách dễ dàng để nghĩ về nó)

Vì vậy, tại 5, nó sẽ cố gắng xử lý 5 tại một thời điểm. Vì # 1 đang mất 5 giây, # 2 chắc chắn sẽ kết thúc trước. Có khả năng sẽ # 3, # 4 và # 5. Có lẽ ngay cả # 6 (kể từ khi # 2 được thực hiện, DoP sẽ cho phép nó bắt đầu trên # 6)

Thậm chí không có sự chậm trễ, không có thứ tự được bảo đảm cho quá trình xử lý. Vì vậy, không bao giờ phụ thuộc vào đơn đặt hàng THEO EXECUTE. Có nói rằng, khi bạn sử dụng kết quả đầu ra thư (NOT prtinting, vì đó là thứ tự chúng thực thi), chúng sẽ được sắp xếp lại theo thứ tự chúng xuất hiện, mặc dù chúng được thực hiện theo thứ tự tùy ý.

+0

cảm ơn bạn đã làm rõ. Nhưng tôi vẫn chưa rõ khi nào "thông báo đầu ra ... sẽ được sắp xếp lại". Tôi đã cập nhật câu hỏi ban đầu của mình để xem liệu hiểu của tôi có đúng không? – SimonSays

+0

Luồng dữ liệu TPL cung cấp một cơ chế nhắn tin đầy đủ được thiết kế để nhận dữ liệu vào và ra khỏi các khối. Kiểm tra hướng dẫn tuyệt vời này từ MS với các ví dụ chính xác. https://msdn.microsoft.com/en-us/library/hh228597(v=vs.110).aspx – Tim

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