2015-06-30 8 views
6

Zajmuję się tworzeniem serwera gier MMORPG, podczas gdy to podejście nie jest potrzebne dla 80% funkcji serwera gry, 20% funkcji, które mogłyby z niego korzystać, stanowi 99% zasobów zastosowania."Przepustnica" funkcja

Próbuję wykonać funkcję throttled. Załóżmy, że wywołujesz ogromną funkcję lub szukasz ogromnej struktury danych dla określonych kryteriów. To wywołanie może spowodować ogromne użycie procesora.

Na przykład, ogromna funkcja, gdy jest wywoływana, wykorzystuje stałe 30% CPU przez 4 sekundy, aby zakończyć, na przykład, że przeszukujemy miliony wpisów w systemie aukcyjnym według kryteriów. Wyobraźmy sobie, że mamy 4 osoby robiące to jednocześnie. Chcę zrobić tę samą metodę, aby pobrać tylko 1% procesora lub mniej, biorąc pod uwagę może więcej niż 15-20 sekund, aby zwrócić ten sam wynik bez głodzenia sprzętu.

Do tej pory używam tej klasy.

public class AsyncLazy<T> : Lazy<Task<T>> 
{ 
    public AsyncLazy(Func<T> valueFactory) : 
     base(() => Task.Factory.StartNew(valueFactory)) { } 
    public AsyncLazy(Func<Task<T>> taskFactory) : 
     base(() => Task.Factory.StartNew(() => taskFactory()).Unwrap()) { } 
} 

Nie blokuje to podczas inicjowania wartości i nie blokuje się podczas konsumowania wartości leniwej. Jednak podczas masywnych operacji wykonanie operacji głodzi sprzęt, aby ukończyć zadanie, powodując 30% użycie procesora przez 4 sekundy. Moim celem jest dławienie połączeń przez praktycznie nieograniczoną ilość czasu, aby mogli wykonać swoje zadanie bez głodującego sprzętu.

Edytuj: Podziękowania dla Scotta Chamberlina za poprawienie mnie właściwym "żargonem". Nie szukam metody leniwie, ale szukam "Throttle" specyficznych wywołań metod.

+5

Lazy ma określone znaczenie w języku C#, czego szukasz, to Dławienie, a nie Łazy. –

+0

Dziękuję, nie wiedziałem o tym. Moim celem jest tutaj dławienie określonych połączeń. – Scotty

+0

Proszę zaktualizować swoje pytanie (i jego tytuł), aby ponownie je sformułować, aby skupić się na fakcie, że chcesz ograniczyć wykonanie, a nie wykonać go leniwie. –

Odpowiedz

3

Jak można dusić funkcję przy użyciu języka programowania?

Jak wspomniała willaien, Priorytet wątku jest jednym z niewielu mechanizmów dławiących procesor w procesie, a nawet to jest pośrednie. Dzieje się tak, ponieważ to nie aplikacja jest odpowiedzialna za bezpośrednie kontrolowanie wykorzystania procesora; Obowiązkiem OS i procesora jest zarządzanie zasobami systemowymi, takimi jak wątki. Dzięki temu system operacyjny może zapobiec awarii wszystkich aplikacji.

Jak możesz dusić swoją funkcję poza swoim językiem programowania?

Możesz podzielić intensywne obliczenia na zupełnie odrębną usługę. Następnie umieść tę usługę na innej maszynie, aby bezpośrednio sterować zasobami z poziomu systemu lub systemu operacyjnego (na przykład dodając więcej pamięci lub mocy procesora przez sprzęt lub przy użyciu maszyn wirtualnych). Za pomocą VM można "dławić" funkcję, ustawiając procesory VM. Możesz "dławić" czystym sprzętem lub maszynami wirtualnymi za pomocą oprogramowania pośredniego, takiego jak moduł równoważenia obciążenia lub używając kolejki, aby ograniczyć liczbę żądań w toku. Spełniłoby to twoje wymagania co do każdego obliczenia, jeśli tylko zajdzie taka potrzeba. A ta inna usługa mogłaby po prostu być rozproszoną pamięcią podręczną (jak wspomniał Scott Chamberlain) procą przechowywaną w bazie danych lub zapytaniem, gdzie baza danych znajduje się na innym komputerze.

Jeśli wybierzesz tę trasę, możesz zbadać wzór asynchroniczny .NET. Zapewniłoby to również, że oryginalna usługa nie jest powiązana wątkiem przez wątki blokujące podczas korzystania z usługi rozproszonej.

+0

jak przepustnica? - simple: wywołać 'sleep (delay)'. Oto jak [narysować falę sinusoidalną za pomocą użycia procesora] (http://stackoverflow.com/q/551494/4279). W praktyce ustaw powinowactwo procesora, przeprowadź procedurę i pozwól systemowi na zaplanowanie. – jfs

+0

Prawda. Jeśli zrobisz to w pętli, możesz "dławić" tę funkcję. Ale powinieneś to rozważyć: http://stackoverflow.com/questions/8815895/why-is-thread-sleep-so-harmful Zastanów się, jak można konserwować, aby precyzyjnie dławić za pomocą snu. –

+0

Wspomniałem 'sleep()', aby wskazać, że priorytet wątku nie jest "jedynym" rozwiązaniem (twoja edycja go uznaje), chociaż nie uważam tego za praktyczny i dlatego istnieje drugie zdanie, które zaczyna się od "w praktyce ". – jfs