2009-10-24 10 views
15

Czy mogę ustawić maksymalny rozmiar skrzynki pocztowej aktora w Scali?limit rozmiaru skrzynki pocztowej scala

Rozwiąż problem Producent - konsument. Za pomocą wątków mogę zablokować producentów, gdy bufor się zapełni. Zobaczyłem kilka przykładów producenta-konsumenta napisanych w Scali i wszystkie używają aktorów ze skrzynkami pocztowymi używanymi jako "bufor". Czy mogę ustawić rozmiar skrzynki pocztowej tak, aby producenci czekali, aż konsument będzie gotowy? Jakieś inne eleganckie rozwiązanie, aby uniknąć niekontrolowanego wzrostu liczby skrzynek pocztowych?

Odpowiedz

16

Można utworzyć aktora, który działa jako bufor pomiędzy producentem a konsumentem. Bufor sprawdza swoją skrzynkę pocztową w swoich danych pętli. Odsyła producentowi komunikat "przeciążenia", gdy liczba buforowanych produktów jest zbyt wysoka; i wysyła "czysty" komunikat, gdy wszystko wróci do porządku. W przypadku zbyt wielu wiadomości po prostu upuszcza przychodzące (lub najstarsze).

Konsument aktywnie żąda dla produktów z buforem, który z kolei odsyła jeden produkt. Jeśli bufor jest pusty, konsument wciąż czeka na dane wejściowe.

Producent wysyła produkty do aktora bufora. Jeśli otrzyma komunikat "przeciążenia", może zatrzymać produkcję lub kontynuować produkcję, wiedząc, że produkty mogą zostać porzucone.

Oczywiście takie rozumowanie mogłoby być realizowane bezpośrednio do producenta lub samego konsumenta, ale osobny bufor pozwala na wprowadzenie wielu producentów i/lub konsumentom łatwiej.

5

Sposób Actor.mailboxSize zwraca liczbę oczekujących wiadomościach w skrzynce pocztowej aktora.

ten może być stosowany do dławienia producentowi na różne sposoby.

Na przykład, jedną z możliwości może być,

producent sprawdza, czy konsumenta mailboxSize jest większa niż jakiegoś progu. Jeśli tak, to wysyła do konsumenta SpecialMessage i blokuje semafor. Kiedy konsument otrzymuje to SpecialMessage, zwalnia semafor. Producent może teraz wesoło kontynuować swoją działalność.

ten sposób unika odpytywanie jak również wszelkie spadła wiadomości.

+1

Ankietowanie wydaje się bardziej odpowiednie dla mnie niż uczynienie skrzynki pocztowej konsumenta "wspólnym stanem" pomiędzy dwoma aktorami. – Zed

+1

Ankietowanie jest często lepsze z perspektywy czysto programistycznej, ale semafory są często lepsze z punktu widzenia wykorzystania sprzętu. Zależy od Twojej dokładnej sytuacji, która powinna zostać wybrana. –

+0

@Zed Skrzynka pocztowa konsumenta IS jest udostępniona! W przeciwnym razie producent nie będzie mógł wysłać do niego żadnych wiadomości :) – HRJ