2015-05-06 10 views
7

Udało mi się wysłać pracę do puli aktorów, aby wykonać moją pracę, ale teraz chcę zrobić pewne skupienie na wynikach zwróconych przez wszystkich pracowników. Skąd mam wiedzieć, że wszyscy są skończeni?Jak mogę czekać na zakończenie wszystkich prac w Akka.Net?

Najlepsze, co wymyśliłem, to zachować zestaw identyfikatorów żądań i poczekać, aż zestaw przejdzie do zera, ale wydaje się to nieeleganckie.

Odpowiedz

8

Ogólnie rzecz biorąc, chcemy użyć tego, co nazywamy wzorem "Dowódcy". Zasadniczo masz jednego stanowego aktora (Commander), który jest odpowiedzialny za uruchamianie i monitorowanie zadania. Następnie wyodrębniasz rzeczywistą pracę w puli aktorów i po zakończeniu ich raport z powrotem do Commander. Dowódca może następnie śledzić postępy pracy, obliczając # completions/size of worker pool.

ten sposób pracownicy mogą być monitorowane i wznowiona niezależnie jak robią pracy, ale wszystkie cenne stanu i informacji o zadaniach poziom mieszka w Commandera (nazywa się "Error Kernel pattern")

możesz zobaczyć przykład tego w Akka.NET scalable webcrawler demo.

+1

Dzięki. To brzmi jak zasadniczo to, co w końcu robiłem. Miałem aktorskiego aktora, który koordynuje wszystko, i wykonuje zadania i śledzi odpowiedzi. Dokumenty, które wyprodukowaliście od niedawna, nie mają sobie równych. Dzięki! – Damian

+0

w przypadku, "dowódca" powinien ** czekać ** zakończenie na wszystkie dzieci? jeśli nie, "dowódca" ** nie może być wykonany dwukrotnie ** w tym samym czasie? – constructor

+0

@constructor Możesz obejść to ograniczenie, tworząc pulę swoich dowódców. Potem po prostu wyślesz pracę do puli, a to zrównoważy pracę pomiędzy aktorami-dowódcami. (Aktorzy-dowódcy mogą być także pełnoprawni, tj. "Zostań (zajęty)" lub "Zostań (Gotowy)" i zdecyduj się na nowe zlecenia pracy "Stash", dopóki nie będą "Gotowi" je przetworzyć, itp. – BrainSlugs83

Powiązane problemy