Dostępne biblioteki Coroutine w Javie

Chciałbym zrobić kilka rzeczy w Javie, które byłyby jaśniejsze, gdyby były pisane przy użyciu funkcji współbieżnych, ale dla których pełne wątki są poważną przesadą. Odpowiedź, oczywiście, jest użycie coroutine , ale nie wydaje się, aby wsparcie coroutine w standardowych bibliotekach Java i szybkie Google na nim przywołuje kuszące wskazówki tu lub tam, ale nic istotnego.

Oto co znalazłem do tej pory:

  • JSIM ma klasę coroutine, ale wygląda dość ciężko i zderza się, pozornie, z wątki w punktach. Chodzi o to, aby zmniejszyć złożoność pełnego wątku, a nie dodać do to. Co więcej, nie jestem pewien, czy klasa może być wyodrębniona z biblioteki i używana niezależnie.
  • Xalan ma klasę coroutine set, która robi rzeczy podobne do coroutine, ale znowu jest wątpliwe, czy to można w znaczący sposób wyodrębnić z całej biblioteki. Wygląda też na to, że jest zaimplementowany jako / align = "left" / forma puli wątków, a nie jak rzeczywiste koroutines.
  • jest projekt kodu Google który wygląda jak to, czego szukam, ale jeśli już to wygląda bardziej waga ciężka niż używanie nici. W zasadzie denerwuje mnie coś, co wymaga oprogramowania do dynamicznie zmieniaj kod bajtowy JVM w czasie wykonywania pracy. To wygląda jak przesada i jak coś, co spowoduje więcej problemów, niż coroutines by rozwiązały. Dalej wygląda na to, że nie wdrożyć całość coroutine concept. Moim zdaniem daje yield funkcję, która po prostu zwraca do fakturującego. Właściwe koroutiny pozwalają yield s przenieść kontrolę bezpośrednio do dowolnego znanego koroutinu. Zasadniczo ta biblioteka, ciężka i straszna, daje tylko wsparcie dla iteratorów, a nie w pełni ogólne koroutiny.
  • promowany Coroutine dla Javy zawodzi, ponieważ jest specyficzny dla platformy (oczywiście za pomocą JNI) rozwiązanie.

I to wszystko, co mam znaleziono.

Wiem o natywnej obsłudze JVM dla coroutines w maszynie Da Vinci i wiem również o tricku JNI continuations trick , Aby to zrobić. Nie są to jednak dla mnie dobre rozwiązania, ponieważ niekoniecznie miałbym kontrolę nad tym, na której maszynie wirtualnej lub platformie będzie działał mój kod. (Rzeczywiście, każdy system manipulacji kodem bajtowym miałby podobne problemy - najlepiej byłoby, gdyby była to czysta Java, jeśli to możliwe. Manipulacja kodem bajtowym środowiska wykonawczego ograniczyłaby mi użycie to na przykład na Androidzie.)

Czy ktoś ma jakieś wskazówki? Czy to w ogóle możliwe? Jeśli nie, czy będzie to możliwe w Javie 7?

Edited to add:

Aby upewnić się, że zamieszanie jest opanowane, jest topowiązane pytanie do mojego drugiego , ale nie to samo. Ten szuka istniejącej implementacji w celu uniknięcia niepotrzebnego wymyślania koła. Druga to pytanie dotyczące tego, jak jeden jeśli to pytanie okaże się bez odpowiedzi, będzie się to wiązało z implementacją coroutines w Javie. Intencją jest utrzymywanie różnych pytań w różnych wątkach.


dalej edytowane, aby dodać:

Odpowiedź została wybrana . Niektóre komentarze są jednak w porządku. Wskazana biblioteka nie jest biblioteką koroutine, więc technicznie nie odpowiada na moje pytanie. To powiedziawszy, ma jednak dwie krawędzie nad projektem Google Code powiązanym z powyżej:

  1. oba rozwiązania wykorzystują manipulację kodem bajtowym, ale wybrana biblioteka Pozwala na statyczne manipulowanie kodem bajtowym , co czyni ją użyteczną w systemie Android i innych niezgodnych stosach JVM.
  2. projekt Google Code nie robi pełnych coroutines. Podczas gdy biblioteka odpowiedzi w ogóle nie robi coroutines, robi coś ważniejszego: zapewnia dobre, podstawowe narzędzie do tworzenia własnych, w pełni funkcjonalnych coroutines.
Author: Community, 2010-05-17

8 answers

Javaflow jest implementacją kontynuującą, prawdopodobnie pozwoli Ci to zrobić. Używa jednak manipulacji kodem bajtowym.

W każdym razie, wydaje mi się, że próbujesz zrobić OOP z prostym C. Jest to wykonalne, ale to nie znaczy, że powinieneś to zrobić.

 12
Author: Guillaume,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-17 06:14:12

Framework Kilim implementuje coroutines używając przepisywania kodu bajtowego. Sam używałem go do implementacji lekkich procesów w Erjang, i jest bardzo stabilny i zaskakująco szybki jak na ilość bajtowego przepisywania kodu, który trwa.

Koroutiny Kilima oddziałują za pomocą skrzynek pocztowych, więc używam frameworka do modelowania aktorów Erlanga. Ale równie dobrze może być używany do routine w modelu pamięci współdzielonej.

 10
Author: Kresten Krab Thorup,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-25 07:17:18

Co sądzicie o tej bibliotece napisanej przez Matthiasa Manna? Skopiowałem plusy i minusy ze strony internetowej twórcy, aby ułatwić dyskusję. Ważne jest, aby spojrzeć na testy w kodzie źródłowym, aby zobaczyć więcej niż jeden przykład na stronie internetowej.

Http://www.matthiasmann.de/content/view/24/26/

Zacznijmy od tego, co otrzymujesz:

  • Pisz prosty kod sekwencyjny - nie musisz już tworzyć maszyn stanowych ręcznie
  • nie Wątki są tworzone lub potrzebne-brak problemów z synchronizacją wielu wątków]}
  • brak tworzenia śmieci z wykonania kodu
  • bardzo mały czas pracy
  • tylko wywołania metody zawieszającej są zmieniane - wszystkie wywołania do standardowej biblioteki (jak java.util.* etc) nie są naruszone w ogóle.
  • Pełna obsługa serializacji
  • Możesz zapisać stan wykonania coroutines jako część stanu gry w zapisie gry bez dodatkowego kodu. Wymaga to oczywiście że Twoje klasy i typy danych, których używasz w swoich koroutinach, można serializować. Pełne wsparcie dla obsługi wyjątków i wreszcie bloków
  • wstępne przetwarzanie Offline nie spowalnia czasu ładowania aplikacji Oczywiście możliwe jest również oprzyrządowanie uruchomieniowe.
  • bardzo mała biblioteka runtime-mniej niż 10 KByte (nieskompresowany JAR) Licencja BSD

Z tymi wszystkimi wspaniałymi funkcjami-możesz pytać o wady. Cóż jest oczywiście kilka wady:

  • konstruktory i inicjalizatory statyczne nie mogą być zawieszone
  • metody Suspendable nie mogą być zsynchronizowane ani mieć zsynchronizowanych bloków
  • musisz pobrać bibliotekę ASM3, aby uruchomić zadanie oprzyrządowania
  • nie można wywołać metody suspendable z odbiciem

Problem synchronizacji można obejść, umieszczając kod, który wymaga użycia synchronizacji we własnej metodzie.

 9
Author: rrmckinley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-14 00:58:21

Twoje wymagania wydają się być:

  • lekki-nie oparty na wątkach,
  • Brak opierania się na kodzie natywnym i
  • Brak modyfikacji kodu bajtowego.

Mam paskudne przeczucie, że te wymagania wykluczyły wszystkie sensowne strategie implementacji corutynów w Javie.

 5
Author: Stephen C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-17 05:39:21

Framework Play zapewnia teraz kontynuacje z Javaflow. Ponieważ gra zapewnia tak wiele wygody w innych obszarach, możesz zacząć od tego.

Http://www.playframework.org/documentation/1.2RC2/releasenotes-1.2#Continuations

 2
Author: rrmckinley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-09 15:57:25

Jeśli używasz Javy, dostępne są 2 opcje od końca 2017 roku:

Oba są oparte na commons-javaflow -- przepisują Twój kod na poziomie bajtowym, aby wszystko zaczęło działać.

I maintain Coroutines -- up-Side jest to, że jest szybki, obsługuje wszystkie główne systemy budowania i obsługuje serializację/wersjonowanie Twoich coroutines. Down-side jest to, że API ma kilka odstępstw od commons-javaflow.

Vsilaev utrzymuje Tasclate-Javaflow -- nie używałem go, więc nie mogę o nim mówić, ale jest utrzymywany i patrząc na przykłady, jego API jest zbliżone do commons-javaflow.

Istnieją również funkcje językowe w Kotlin i Scali (i być może innych językach opartych na JVM), które pozwalają na korzystanie z coroutines. Ale przed przełączeniem języków powinieneś być świadomy, że Kotlin, Scala lub jakikolwiek język JVM du jour jest dzisiaj Nie i nigdy nie będzie Javą. Cokolwiek robi w tle, aby wszystko działało, może nie działać, gdy następne wydanie JVM się toczy.

Ludzie, którzy utrzymują JDK w Oracle, mają udokumentowane doświadczenie w korzystaniu z tych języków JVM innych firm jako badań rynku. Jeśli funkcja wysokiego poziomu zostanie dodana do języka JVM innej firmy i będzie wystarczająco popularna, włączą ją do Javy. To właśnie dzieje się teraz z coroutines. Jest projekt OpenJDK o nazwie projekt Krosno , który ma na celu dodanie corutines do języka Java.

To jeszcze początek projektu Krosno. Jeśli krytycznie spojrzysz na propozycję, to jest bałagan. Jestem pewien, że ustabilizuje się w miarę upływu czasu, ale to, co ostatecznie dostaniemy, może być zupełnie inne niż to, czego wielu z nas oczekuje.

Podsumowując, możesz użyć jednego z zestawów narzędzi oprzyrządowania kodu bajtowego lub zmienić języki. Projekt Krosno jest jeszcze w pierwszych dniach i jest możliwość, że nigdy nie zostanie dodany do Javy.

 2
Author: offbynull,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-27 16:31:49

Kwazar implementuje go-podobne koroutiny i kanały wśród innych funkcji za pomocą ciągów.

Więcej Szczegółów, benchmarki i linki na Quasar w mojej kolejna odpowiedź .

 0
Author: Vadzim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:01

Sprawdziłam powiązane pytanie, które podlinkowałeś i do końca nie rozumiem, co jest złego w wątkach. W Javie wątki nigdy nie są natywnymi, są jedynie izolowanymi jednostkami wykonawczymi, które w zależności od kontekstu mogą działać jako własne natywne wątki, jeśli jest to korzystne, tzn. dzielenie dużych bloków wykonawczych na własne wątki jest inteligentne, a trzymanie małych w kilku jest bardziej rozsądne ze względu na koszty ogólne.

To powiedziawszy, Java / JDK nie ma natywnie coroutines dostępne dla programistów wysokiego poziomu-jeszcze. JDK7 ( ilekroć to wyjdzie ) będzie miał coś, co jest znane jako jsr166y, który jest frameworkiem Fork/Join autorstwa Douga Lea. Aby uzyskać informacje techniczne, Sprawdź ten plik PDF autorstwa samego Pana Lea. W praktyce Fork / Join dodaje kolejne (przydatne!) poziom szczegółowości w modelu gwintowania wewnętrznego Javy, który powinien pomóc ci osiągnąć to, czego chcesz.

 -2
Author: Esko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-18 06:59:59