2011-02-06 17 views
14

moje pytanie brzmi, czy istnieje framework w Javie do zarządzania i jednoczesnego uruchamiania zadań, które mają zależności logiczne.Java Framework do zarządzania zadaniami

Moje zadanie wygląda następująco: Mam wiele niezależnych zadań (powiedzmy: A, B, C, D ...), Są one implementowane jako polecenia (jak w strukturze polecenia). Chciałbym mieć swego rodzaju wykonawcę, który zaakceptuje wszystkie te zadania i wykona je równolegle. Zadania mogą być zależne od siebie (na przykład, nie mogę uruchomić C, zanim uruchomię A), synchroniczne lub asynchroniczne.

Chciałbym również wprowadzić niestandardowe heurystyki, aby wpłynąć na wykonanie harmonogramu, na przykład, jeśli zadania A i B są obciążone przez procesor, a C ma, powiedzmy, wysokie zużycie pamięci, ma sens uruchamianie A i C w równolegle, zamiast uruchamiać A i B.

Przed nurkowaniem w budowanie tych rzeczy przeze mnie (myślę o java.util.concurrent + uwarunkowaniach opartych na ograniczeniach/regułach), zastanawiałem się, czy ktoś mógłby wskazać mi na jakiś projekt, który może odpowiadać moim potrzebom. Bardzo dziękuję z góry

+0

Czy spojrzeć na Fork/Join? –

+0

Zastanawiam się, czy zadania wykorzystują ponownie wyniki, czy nie. Jeśli są raczej niezależnymi jednostkami pracy z predefiniowaną sekwencją, wówczas planowanie i niestandardowa heurystyka mogłyby zostać rozwiązane przez całkiem prosty niestandardowy executor puli wątków. –

+0

Tak, myślę również o użyciu Executor Services z java.util.concurrent, zadania wydają się być niezależne w zakresie ponownego wykorzystania wyników z siebie nawzajem. Powinienem rzucić okiem na widelec/join, jak uprzejmie zaproponował Viktor Klang. –

Odpowiedz

7

Nie sądzę, że istnieją ramy zarządzania zadaniami, które mogłyby spełnić Twoje wymagania. Jesteś na właściwej ścieżce, używając wzoru Polecenie. Możesz spojrzeć na Akka framework dla uproszczonego modelu współbieżności. Akka jest oparta na modelu Aktor:

Model aktor jest kolejnym bardzo prosty model współbieżności wysoki poziom: aktorzy nie może odpowiedzieć na więcej niż jednej wiadomości naraz (komunikaty są w kolejce do skrzynek pocztowych) i może komunikować się tylko przez wysyłając wiadomości, nie udostępniając zmiennych . Dopóki wiadomości są struktury niezmienna danych (co jest zawsze prawdziwe w Erlang, ale musi być konwencja w językach bez środków zapewnienia tej właściwości), wszystko jest thread-safe, bez konieczności jakiegokolwiek inne mechanizm. Jest to bardzo podobne do , aby zażądać cyklu znalezionego w frameworkach programistycznych MVC WWW . http://metaphysicaldeveloper.wordpress.com/2010/12/16/high-level-concurrency-with-jruby-and-akka-actors/

Akka jest napisana w Scali, ale eksponuje czyste API Java.

2

Zalecam, aby zbadać możliwość użycia w tym celu ant. Chociaż ant jest znane jako popularne narzędzie do budowania, to faktycznie jest sterowanym przez XML silnikiem, który uruchamia różne zadania. Myślę, że jego flaga fork=true robi dokładnie to, czego potrzebujesz: uruchamia zadania równolegle. Ponieważ dowolna aplikacja java ant może być wykonana z innej aplikacji java: po prostu wywołaj jej metodę main. W tym przypadku możesz owijać swoje zadania za pomocą API Ant, tj. Implementować je jako zadania Ant.

Nigdy nie próbowałem tego podejścia, ale uważam, że powinno działać. Myślałem o tym kilka lat temu i zasugerowałem to mojemu kierownictwu jako możliwe rozwiązanie problemu podobnego do twojego.

+0

Tak, również pomyślałem o tej opcji. Wygląda na to, że odpowiada moim potrzebom, ale na swój sposób :) Wygląda jak złe narzędzie do rozwiązania tego problemu. Zadania są już napisane (jest to część dużego kodu gotowego do produkcji). Więc wprowadzenie mrówki tylko po to, by rozwiązać to, brzmi jak przesada. Dzięki za porady! –

+0

Nie wspominaj. Częściowo się z tobą zgadzam, kiedy mówisz, że mrówka to niewłaściwe narzędzie. Myślę, że używanie mrówki tutaj jest jej nadużyciem. Uważam jednak, że czasami nadużycie interfejsu API może być przydatne. Napisałem nawet artykuł na ten temat: http://java.dzone.com/articles/useful-abuse – AlexR

0

Jest ramy specjalnie do tego celu zwanego dexecutor (Zastrzeżenie: Jestem właścicielem)

Dexecutor jest bardzo lekkie ramy waga wykonać zależne/niezależne zadania w wiarygodny sposób, aby to zrobić, to oferuje minimalne API.

  • API do dodawania węzłów w grafie (addDependency, addIndependent, addAsDependentOnAllLeafNodes, addAsDependencyToAllInitialNodes Później dwa to wersja hybrydowa z dwóch pierwszych)
  • a drugi do wykonania węzły w kolejności.

Oto najprostszy przykład:

DefaultDependentTasksExecutor<Integer, Integer> executor = newTaskExecutor(); 

    executor.addDependency(1, 2); 
    executor.addDependency(1, 2); 
    executor.addDependency(1, 3); 
    executor.addDependency(3, 4); 
    executor.addDependency(3, 5); 
    executor.addDependency(3, 6); 
    //executor.addDependency(10, 2); // cycle 
    executor.addDependency(2, 7); 
    executor.addDependency(2, 9); 
    executor.addDependency(2, 8); 
    executor.addDependency(9, 10); 
    executor.addDependency(12, 13); 
    executor.addDependency(13, 4); 
    executor.addDependency(13, 14); 
    executor.addIndependent(11); 


    executor.execute(ExecutionBehavior.RETRY_ONCE_TERMINATING); 

Oto jak wykres zależność byłaby zbudowana enter image description here

Zadania 1,12,11 będzie prowadzony równolegle, raz na te zadania Ukończono zadania zależne, na przykład, powiedzmy, że kończy się zadanie 1, zadania 2 i 3 będą działać podobnie, po wykonaniu zadania 12, zakończy się zadanie 13 i tak dalej.

Powiązane problemy