Подтвердить что ты не робот

Доступные библиотеки Coroutine на Java

Я хотел бы сделать кое-что на Java, которое было бы более ясным, если бы оно было написано с использованием параллельных процедур, но для которых потоки с полным потоком являются серьезными излишествами. Ответ, конечно, заключается в использовании сопрограммы, но, похоже, нет поддержки сопрограммы в стандартных Java-библиотеках и в быстрой Google на нем возникают дразнящие намеки здесь или там, но ничего существенного.

Вот что я нашел до сих пор:

  • JSIM имеет класс сопрограммы, но он выглядит довольно тяжелым и сложным, казалось бы, с  потоки в точках. Дело в том, чтобы уменьшить сложность полнопоточной резьбы, а не добавлять к ней  Это. Далее я не уверен, что класс можно извлечь из библиотеки и использовать самостоятельно.
  • Xalan имеет класс набора сопрограмм, который выполняет сопроводительные материалы, но снова это сомнительно, если это  могут быть осмысленно извлечены из общей библиотеки. Он также выглядит как выполненный как  жестко контролируемая форма пула потоков, а не как фактические сопрограммы.
  • Здесь Проект Google Code, который выглядит так, как я за ним, но если что-то еще выглядит  тяжелее, чем использование потоков. Я в основном нервничаю от чего-то, что требует программного обеспечения для  динамически изменять байт-код JVM во время выполнения, чтобы выполнить свою работу. Это похоже на излишний  то, что вызовет больше проблем, чем coroutines будет решать. Кроме того, похоже, что это не  реализовать всю концепцию coroutine. Своим взглядом он дает функцию yield, которая просто возвращает  для вызывающего. Правильные сопрограммы позволяют yield напрямую передавать управление любой известной сопрограмме.  В принципе, эта библиотека, тяжелая и страшная, только дает вам поддержку итераторам, а не  полностью общие сопрограммы.
  • Многообещающе названный Coroutine для Java терпит неудачу, потому что он зависит от платформы (очевидно, используя  JNI).

И это обо всем, что я нашел.

Я знаю о встроенной поддержке JVM для сопрограмм в машине Da Vinci, и я также знаю о трюк продолжения JNI для этого. Однако для меня это не очень хорошие решения, поскольку я не обязательно буду контролировать, на какой VM или платформе будет работать мой код. (Действительно, любая система манипулирования байт-кодами будет сталкиваться с аналогичными проблемами - лучше всего было бы использовать эту чистую Java. Возможно, использование байт-кода в режиме исполнения времени ограничило бы меня использованием этого на Android.)

У кого-нибудь есть указатели? Возможно ли это? Если нет, возможно ли это в Java 7?


Отредактировано для добавления:

Просто чтобы убедиться, что путаница содержится, это связанный с нами вопрос мой другой, но не тот же. В этом случае вы ищете реализацию существующей, чтобы избежать необходимости повторно изобретать колесо. Другой вопрос - вопрос о том, как можно было бы реализовать сопрограммы на Java, если этот вопрос окажется неопровержимым. Цель состоит в том, чтобы задавать разные вопросы по различным темам.


Далее отредактирован, чтобы добавить:

Выбран ответ . Однако некоторые комментарии в порядке. Библиотека указала, что это не библиотека сопрограмм, так что она технически не отвечает на мой вопрос. Однако, как сказано, он имеет два края над проектом Google Code, связанным выше:

  • В обоих решениях используется обработка байт-кода, но выбранная библиотека позволяет использовать статическую байт-кодовую манипуляцию, которая делает ее пригодной для использования в Android и других несоответствующих пакетах JVM.
  • В проекте Google Code не выполняются полные сопрограммы. Хотя библиотека ответов даже не выполняет сопрограммы, она делает что-то более важное: она обеспечивает хороший базовый инструмент для переливания моих собственных полнофункциональных сопрограмм.
4b9b3361

Ответ 1

Javaflow - это реализация продолжения, она, вероятно, позволит вам это сделать. Однако он использует манипуляции с байт-кодом.

В любом случае, похоже, что вы пытаетесь сделать ООП с простым C. Это выполнимо, но это не значит, что вы должны это делать.

Ответ 2

Kilim framework реализует сопрограммы с использованием перезаписи байтового кода. Я сам использовал его для реализации легковесных процессов в Erjang, и он очень стабилен и на удивление быстрый для количества перезаписи байт-кода это продолжается.

Kilim coroutines взаимодействуют с использованием почтовых ящиков, поэтому я использую фреймворк для моделирования актеров Erlang. Но его можно также использовать для выполнения сопрограмм в модели общей памяти.

Ответ 3

Что вы думаете об этой библиотеке продолжений, написанной Маттиасом Манном? Я скопировал плюсы и минусы с веб-сайта создателя, чтобы облегчить обсуждение. Важно посмотреть тесты в исходном коде, чтобы увидеть за пределами одного примера на веб-сайте.

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

Давайте начнем с того, что вы получите:

  • Напишите простой последовательный код - вам больше не нужно создавать государственные машины вручную
  • Никакие нити не созданы или не нужны - нет проблем с синхронизацией нескольких потоков.
  • Никакое создание мусора из выполнения кода
  • Очень небольшие накладные расходы времени выполнения
  • Изменены только подозрительные вызовы методов - все вызовы в вашу стандартную библиотеку (например, java.util. * и т.д.) вообще не затрагиваются.
  • Полная поддержка сериализации
  • Вы можете сохранить состояние выполнения сопрограмм как часть состояния игры в вашей игре сохранения без дополнительного кода. Это, конечно, требует, чтобы ваши классы и типы данных, которые вы используете в своих сопрограммах, сериализуемы. Полная поддержка обработки исключений и, наконец, блоков.
  • Непрерывная предварительная обработка не замедляет время загрузки приложения Разумеется, возможно использование инструментария времени исполнения.
  • Очень маленькая библиотека времени исполнения - менее 10 Кбайт (несжатый JAR) Лицензия BSD

Со всеми этими замечательными функциями - вы можете просить о недостатках. Ну, конечно, есть несколько недостатков:

  • Конструкторы и статические инициализаторы не могут быть приостановлены
  • Приостановленные методы не могут быть синхронизированы или иметь синхронизированные блоки
  • Вам необходимо загрузить библиотеку ASM3 для запуска контрольной задачи.
  • Вы не можете вызвать метод suspendable с отражением

Проблема синхронизации может быть решена путем помещения кода, который требует использования синхронизации в свой собственный метод.

Ответ 4

Ваши требования выглядят следующим образом:

  • легкий - не основанный на Threads,
  • не полагаться на собственный код и
  • не используется модификация байт-кода.

У меня неприятное ощущение, что эти требования исключили все разумные стратегии для реализации сопрограмм в Java.

Ответ 7

Если вы используете Java, на конец 2017 года доступны 2 варианта:

Оба они основаны на commons-javaflow - они перезаписывают ваш код на уровне байт-кода, чтобы заставить работать.

Я поддерживаю Coroutines - Поверхности - это то, что он быстро, он поддерживает все основные системы сборки и поддерживает сериализацию /versioning ваших сопрограмм. Нижняя сторона заключается в том, что API имеет несколько отклонений от commons-javaflow.

Vsilaev поддерживает Tasclate-Javaflow - я не использовал его, поэтому я не могу говорить об этом, но он поддерживается и от просмотра примеров, которые API выравнивает по сравнению с примерами commons-javaflow.

В Kotlin также есть языковые функции и Scala (и, возможно, другие языки на основе JVM), которые позволяют использовать сопрограммы. Но, прежде чем переключать языки, вы должны знать, что Kotlin, Scala или что-то вроде JVM-языка du jour на сегодняшний день не является и никогда не будет Java. Независимо от того, что он делает в фоновом режиме, чтобы заставить все работать, может не сработать, когда следующая версия JVM катится.

Люди, которые поддерживают JDK в Oracle, имеют опыт использования этих сторонних JVM-языков в качестве исследования рынка. Если высокоуровневая функция добавляется на сторонний JVM-язык и достаточно популярна, они будут включать ее в Java. Это то, что происходит прямо сейчас с сопрограммами. Существует проект OpenJDK под названием Project Loom, целью которого является добавление сопрограммы к языку Java.

Это еще первые дни для Project Loom. Если вы критически просматриваете это предложение, это беспорядок. Я уверен, что с течением времени он будет стабилизироваться, но то, что мы в конечном итоге получим, может полностью отличаться от того, что многие из нас ожидают.

Чтобы повторить, ваши варианты должны либо использовать один из инструментов инструментария байткода, либо переключать языки. Project Loom все еще в ранние дни, и есть вероятность, что он никогда не сможет быть добавлен в Java.

Ответ 8

Я проверил связанный с вами вопрос и связался с жизнью. Я не могу понять, что так плохо о потоках. В потоках Java никогда не существуют собственные потоки, они представляют собой просто изолированные исполнительные блоки, которые в зависимости от контекста могут работать как собственный собственный поток, если он выгоден, то есть разделение больших блоков выполнения на собственные потоки, является умным, а небольшие - всего несколькими более разумно из-за накладных расходов.

Тем не менее, Java/JDK не имеет собственных сопрограмм, доступных для высокоуровневых программистов. JDK7 (всякий раз, когда это выходит) будет иметь то, что называется jsr166y, которое является структурой Fork/Join от Doug Lea. Для получения технической информации проверьте этот PDF на mr. Лиа сама. На практике Fork/Join добавляет еще один (полезный!) Уровень детализации поверх модели внутренней потоковой обработки Java, которая должна помочь вам достичь того, что вы хотите.