8

Tôi đã quen với việc sử dụng Parallel.For() trong các phần mở rộng song song của .Net vì nó là một cách đơn giản để song song mã mà không cần phải bắt đầu và duy trì các chủ đề (có thể khó sử dụng). Tôi đang nhìn vào một vòng lặp vô hạn (làm điều gì đó cho đến khi tôi báo hiệu nó dừng lại) mà tôi muốn song song, không có một đối số Parallel.For() quá tải để làm điều này vì vậy đã tự hỏi cách tiếp cận tốt nhất ở đây là gì được. Về nguyên tắc tôi chỉ có thể làm như sau: (?)Cách tốt nhất để đạt được Vòng lặp vô hạn song song là gì?

Parallel.For(0, int.Max) 

Nhưng tôi nghi ngờ rằng có thể không phải là một dự kiến ​​/ mô hình hiệu quả cho logic phân vùng làm việc để xử lý

lựa chọn khác là cái gì đó như:

for(;;) 
{ 
    Parallel.For(0, 128, delegate() 
    { 
     // Do stuff. 
    } 
} 

Nhưng điều đó có vẻ không phù hợp và cũng có thể dẫn đến phân vùng công việc không hiệu quả.

Ngay bây giờ bản năng của tôi là làm điều này bằng tay bằng cách tạo và duy trì chủ đề của riêng tôi, nhưng tôi sẽ quan tâm đến việc nhận được một số phản hồi/ý kiến ​​về điều này. Cảm ơn.

=== CẬP NHẬT ===

Tôi đang sử dụng một phiên bản đơn giản của các mã từ bài viết trong các câu trả lời được chấp nhận (Tôi đã gỡ bỏ các tham số ParallelOptions). Dưới đây là các mã ...

public class ParallelUtils 
{ 
    public static void While(Func<bool> condition, Action body) 
    { 
     Parallel.ForEach(IterateUntilFalse(condition), ignored => body()); 
    } 

    private static IEnumerable<bool> IterateUntilFalse(Func<bool> condition) 
    { 
     while (condition()) yield return true; 
    } 
} 

Một cách sử dụng ví dụ sẽ là:

Func<bool> whileCondFn =() => !_requestStopFlag; 
ParallelUtils.While(whileCondFn, delegate() 
{ 
    // Do stuff. 


}); 
+0

có bất kỳ Mô hình luồng nào mà bạn có thể tiêu thụ – MethodMan

Trả lời

8

Stephen Toub có bài đăng về Implementing Parallel While with Parallel.ForEach.

+2

Bài đăng của Stephen Toub khá tiên tiến cho một noob như tôi. Một ví dụ đơn giản sử dụng trên phương pháp tốt nhất/được đề nghị sẽ được nhiều đánh giá cao. –

+0

đây có phải là nhận xét hoặc câu trả lời không? – fubo

2

Nếu bạn (thực sự) muốn một cái gì đó vô hạn sau đó bạn muốn nó trên càng ít lõi một thể. Không ai trong số Parallel.For___ sẽ là một lựa chọn tốt.

Những gì bạn (có thể) cần là một Chủ đề riêng biệt hoặc một Tác vụ được tạo bằng tùy chọn LongRunning.

Và sau đó làm cho nó chờ đợi trên một semaphore, hoặc như một phương sách cuối cùng gọi Sleep() càng thường xuyên càng tốt.

+1

Ngữ cảnh của vấn đề này là dự án khai thác dữ liệu. Tôi đang sử dụng mã phân tích dữ liệu hiện đang chạy vô thời hạn (ví dụ: chạy qua đêm và sau đó báo hiệu nó ngừng vào sáng hôm sau) và nuôi nó thành nhiều chuỗi, vì vậy tôi muốn nó chạy vô thời hạn trên tất cả các lõi. – redcalx

+4

@locster - Có chuỗi chủ "vô hạn" tạo chuỗi con cho công việc của nó. –

1

Xét rằng nó infinit yêu cầu tính toán, nhưng bạn cần phải có một số trạng thái finit trên mỗi "chu kỳ", tôi sẽ nói rằng tôi sẽ thay đổi một giải pháp với một for(;;) vòng lặp bên ngoài để thực hiện một cuộc gọi Parallel.ForEach(...) trên một số sự kiện/trạng thái thay đổi. Giống như một tín hiệu Monitor, thông báo event hoặc một cái gì đó tương tự ...

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