2016-02-22 15 views
5

Tôi không chắc chắn nếu điều này liên quan nhiều hơn đến akka.net hoặc TPL, nhưng tôi sẽ sử dụng các diễn viên cho ví dụ của tôi để làm rõ câu hỏi.Cháy nhiều chủ đề ngay lập tức trong akka.net

Câu hỏi tóm lại: Có cách nào để yêu cầu akka.net kích hoạt nhiều chuỗi hơn một lần so với thực tế tôi có lõi CPU không? Đây là mã mẫu và chi tiết:

Tôi hiện đang sử dụng máy tính xách tay có bộ vi xử lý 8 nhân. Vì vậy, chúng ta hãy nói rằng tôi đang tạo ra 20 diễn viên:

for (int i = 0; i < 20; i++) 
{ 
    actorList.Add(system.ActorOf<ExampleActor>()); 
} 

Và sau đó tôi đi một thông điệp tới tất cả những:

actorList[0].Tell(new ExampleMessage()); 
Console.WriteLine("sent message to actor 1\t" + DateTime.Now.TimeOfDay); 
actorList[1].Tell(new ExampleMessage()); 
Console.WriteLine("sent message to actor 2\t" + DateTime.Now.TimeOfDay); 
... 
actorList[19].Tell(new ExampleMessage()); 
Console.WriteLine("sent message to actor 20\t" + DateTime.Now.TimeOfDay); 

Tất cả các diễn viên không, khi nhận được tin nhắn là giả sau quá trình dài chạy:

Console.WriteLine("Accessing slow service\t" + DateTime.Now.TimeOfDay 
    + "\t" + Thread.CurrentThread.ManagedThreadId); 
Thread.Sleep(60000); 
Console.WriteLine("Service call was successful\t" + DateTime.Now.TimeOfDay 
    + "\t" + Thread.CurrentThread.ManagedThreadId); 

tôi cũng có mã này trong constructor của nó, vì vậy mà tôi biết khi nam diễn viên này đang thực sự tạo ra:

public ExampleActor() 
{ 
    Console.WriteLine("Creating " + this.Self.Path + DateTime.Now.TimeOfDay); 
    .... 
} 

Vì vậy, bây giờ khi tôi chạy ứng dụng, đầu tiên tôi nhận được dòng "tin nhắn được gửi tới diễn viên" cho tất cả 20 diễn viên - trong cùng một mili giây. Nhưng sau đó, khi thời gian bắt đầu từ khởi tạo, điều xảy ra là chỉ có 8 diễn viên được tạo ra lúc đầu.

Sau đó, vì không có diễn viên nào khác hoàn thành công việc, CHÍNH XÁC 1 giây sau, một diễn viên khác được khởi tạo (lần thứ 9). Một giây sau, chúng tôi đã tạo ra diễn viên thứ 10 và bắt đầu hoạt động Thread.Sleep.

Bây giờ câu hỏi là, có cách nào để nói với akka.net (hoặc TPL dưới nó) rằng tôi chắc chắn rằng các chủ đề sẽ chờ đợi ~ 60 giây cho mỗi cuộc gọi dịch vụ? Vì vậy, rằng tất cả 20 chủ đề được bắn cùng một lúc, thay vì có 8 bắt đầu cùng một lúc, và 20 chủ đề đầy đủ chỉ chạy sau 12 giây đã trôi qua?

Trả lời

3

Các diễn viên Akka chạy trên .Net ThreadPool theo mặc định.

Bạn đang gặp phải sự cố đói trong ThreadPool nơi tất cả các chuỗi có sẵn đang bận (một trên mỗi CPU). Khi tất cả các chủ đề của nó đang bận, ThreadPool thêm một luồng nữa mỗi giây vào nhóm của nó.

Để "giải quyết" sự cố của bạn, bạn có thể tăng số lượng chuỗi tối thiểu bằng ThreadPool.SetMinThreads. Nhưng sửa chữa thực sự là không chặn các chủ đề (và không chặn các diễn viên).

Nếu khối lượng công việc của bạn bị ràng buộc CPU, sẽ không nhanh hơn khi có nhiều diễn viên chạy đồng thời hơn.

Nếu khối lượng công việc của bạn được IO bị ràng buộc, bạn nên gọi nó là không đồng bộ:

Receive<string>(msg => 
{ 
    DoSomethingAsync(msg).PipeTo(Self); 
} 

Receive<Result>(msg => 
{ 
    // Process the result 
} 
+0

Cảm ơn bạn. Thật không may một số khách hàng muốn cài đặt số lượng chỉ rõ ràng, nhưng đối với bất cứ ai đọc điều này, những người không bị ràng buộc bởi các yêu cầu, tôi đề nghị bạn làm theo các tuyến đường không đồng bộ. Được thử nghiệm cả hai, mọi thứ hoạt động hoàn hảo. – nikovn

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