LINUX.ORG.RU
ФорумTalks

В джаву таки завезли горутины

 


2

7

Сабже. Или корутины, если вы вдруг котлинист. Разница с корутинами только в том, что в Котлине - это генерация байткода, а в жабе - это хак JVM

И называются они Файберы. Почему не корутины? Потому что «файберы» - красивей и короче)

Файберы строятся на континуациях, которые можно прерывать.

public class Continuation implements Runnable {
    public Continuation(ContinuationScope scope, Runnable body);
    public final void run();
    public static void yield(ContinuationScope scope);
    public boolean isDone();

    protected void onPinned(Reason reason) {
        throw new IllegalStateException("Pinned: " + reason);
    }
}

и используются они как-то так:

Continuation cont = new Continuation(SCOPE, () -> {
        while (true) {
            System.out.println("before");
            Continuation.yield(SCOPE);
            System.out.println("after");
        }
    });

while (!cont.isDone()) {
    cont.run();
}

Соответственно, файберы реализованы поверх них как

Fiber f = Fiber.execute( () -> {
    System.out.println("Good Morning!");
    readLock.lock();
    try {
        System.out.println("Good Afternoon");
    } finally {
        readLock.unlock();
    }
    System.out.println("Good Night");
});

Внутри файбера соответственно, есть континуация - одна штука, и планировщик - 1 одна штука (общий для всех файберов).

Планировщик берет файбер, выколупывает из него континуацию, и кладёт для выполнения на какой-то реальный нативный тред в ОС.

Суперподробное объяснение я сделал по вот этой ссылке. Есть обычный видеокаст, есть его текстовая расшифровка.

Выводы: Java скоро станет ещё быстрей, чем раньше, и разорвёт всех в пух и прах. Помянем Golang и Nodejs, вы были хорошим источником вдохновения.

★★★★☆

Последнее исправление: stevejobs (всего исправлений: 2)
Ответ на: комментарий от BattleCoder

Что мешает их в очередь, например, отправить?

Ничто не мешает. Можно считать корутины разновидностью очереди с улучшенной эргономикой использования.

А что касается IO - так там вообще будет упираться в диск/сетевой интерфейс...

Чем больше оно упирается в сетевой I/O, тем больше одновременно активных клиентов, тем выгоднее асинхронность.

tailgunner ★★★★★
()
Ответ на: комментарий от BattleCoder

Что мешает их в очередь, например, отправить?

Причем тут очередь? Если у тебя в тредпуле ограничение на 4 треда, то эти треды будут простаивать ожидая ответа от SSD при синхронном IO. Но процессор в это время простоя мог бы выполнить следующие транзакции, чтобы послать новые запросы на SSD. Но в твоей схеме этого не сделать, тем самым не загрузить SSD на полную мощность.

В SSD задержка на чтение рандомного блока положим 0.1мс - это время простаивания треда. Тогда в секунду у тебя будет 40 000 iops на 4 треда.

А мог бы выжать 1 000 000 iops, если бы не простаивал, а разрешил следующим транзакциям занять простаивающие треды и отправить следующие запросы на SSD. Да, в этом случае задержка подросла бы до 0.6мс, но в сумме всё равно получил бы где-то 1 000 000, а не 40 000 iops.

вот тут вроде бы есть вариант и для IO

Зачем мне очередной хипстерский фреймворк? В джаве есть API для работы с асинхронным IO. Вот еще файберы на подвозе. Будем по итогу тестить и смотреть, стоит менять асинхронные колбеки на последовательный «синхронный» код в файберах или цена удобства слишком высока.

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 2)
Ответ на: комментарий от BattleCoder

Что мешает их в очередь, например, отправить?

Память. Та же короутина в Go жрет на 3 порядка (?) меньше памяти чем ОС-поток.

urxvt ★★★★★
()
Ответ на: комментарий от barberry

в смысле, поместить данные для обработки в саму таску..

В том смысле чтобы скомпилить её при первом проходе и выделить память под код и переменные для работы кода.

Если определяется массив или например какой нибудь объект в стиле битмап размером на 4К - то нужно выделение памяти. Да вообще на любой объект и не только при старте, а и в риалтайме. А это затраты времени и да памяти :)

Serg_HIS
()
Ответ на: комментарий от BattleCoder

Сейчас ты над каждым тредом обязан думать - а имеешь ли ты право его запускать, а сколько ты на него потратил и сколько осталось, вот это все. С файберами можно будет плодить их в лютом количестве, хоть каждую строчку в файбер оборачивать. (Ну, это преувеличение, совсем каждую - не надо, только те что имеет какой-то смысл)

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

Как верно сказал тэйлганнер, это продвинутое юзаюбилити. Тебе просто удобно этим пользоваться. Оно делает все то, что раньше ты делал руками, но автоматически.

stevejobs ★★★★☆
() автор топика
Последнее исправление: stevejobs (всего исправлений: 2)
Ответ на: комментарий от stevejobs

В случае файберов - фигарь как есть, это не твоя проблема, пусть рантайм мучается.

Если я правильно понял, то свои древние шашки (реально древние для возрастов многих из здешних троллей, которые младше моей темы обсуждения) смогу портировать на Жабу не заботясь об многопоточности, а оно само запилит?

Тут где-то ошибка. Реально есть ошибка и я не верю, что оно сможет переписать однопоточный алгоритм моих шашек запиленных под DOS в феерически классный алгоритм распараллеленный.

Serg_HIS
()
Ответ на: комментарий от stevejobs

В случае файберов - фигарь как есть, это не твоя проблема, пусть рантайм мучается.

Для нескольких миллионов IO? Чё-то я очкую, Славик...

foror ★★★★★
()
Ответ на: комментарий от Serg_HIS

Да. Конечно я сейчас пилю оптимизированный многопоточный алгоритм для своих шашек. Надеюсь портирование проведу до конца года.

Предполагаю многим будет интересно проигратьпоиграть в современные многопоточные и много-платформенные шашки :)

Serg_HIS
()
Ответ на: комментарий от Serg_HIS

Нет, ты неправильно понял. Если ты напишешь новые шашки на файберах, и вызовешь из них куски старого кода (возможно, даже того от которого не осталось исходника), то обещают, что вероятность поломки будет крайне низка. Если ты не юзал какую-то хитрую логику на тредлокалах и Thread.currentThread(). Вот и всё.

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

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от stevejobs

я очен стараюсь делать так, как делают топовые блогеры ютуба.

Это заметно и ИМНО в этом-то и проблема. Ты пытаешься скопировать, а не найти свой формат. Ну ладно, я думаю, сам разберёшься :D.

vtVitus ★★★★★
()
Ответ на: комментарий от foror

Нет, конечно, что-то встроенное в JRE и как следует оттестированное, несомненно, лучше. Я так и понял, что идеи всё те же.

BattleCoder ★★★★★
()
Ответ на: комментарий от popov-aa

Странно как-то. Гугл и вдруг такое говно.

А по-моему совсем не странно.

bbk123 ★★★★★
()
Ответ на: комментарий от stevejobs

Научись говорить по сути и с хорошей демонстрацией новшеств и тех проблем, которые они решают. У тебя явный перебор смехуечек и прочей бесполезной воды.

bbk123 ★★★★★
()
Ответ на: комментарий от Int64

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

Два чая этому господину!

bbk123 ★★★★★
()
Ответ на: комментарий от i36_zubov

а чо пояснять. Тысячами плодить треды можно (скажем, тысяч эдак до десяти для 64-битной системы, и не более тысячи для 32-битной)

а сейчас их будут плодить сотнями тысяч, может даже миллионами

stevejobs ★★★★☆
() автор топика

/me который год юзает coroutine в lua и с удивлением читает этот пост.

Шо, в жабе coroutine не было раньше? O_o

timdorohin ★★★★
()
Ответ на: комментарий от bug

Линк давно в студии (в исходном сообщении ТС), открой глаза или обратись к окулисту.

bbk123 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.