Многопоточность грядёт
Apr. 22nd, 2015 03:55 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Наткнулся только что в кейноте по новым предложениям для javascript.
Это значит, что мы можем расшаривать данные между workers, со всеми плюшками. То-есть теперь в js есть threads, ну, или совсем скоро будут.
Многопоточность в C++ понимании в JS-мире нужна очень редко (да и в остальных мирах, по-хорошему, тоже) – но зато когда она нужна, без неё туго.
Это, например, вещание потоковых стримов из воркера нескольким (торрент)-слушателям через WebRTC или аналогичные применения. Это разделяемые мемкэши в веб-серверах. Это навороченные игры.
Игры от меня далеко, а вот два других применения – очень даже мне близки.
Обходные манёвры на чистом JS сейчас превращаются или в медленные, или жутко прожорливые решения (а обычно и медленные, и прожорливые). Ну, кажется, теперь всё станет по-другому.
---
Вот хорошо бы ещё пионэры JS-комьюнити смотрели и в сторону Erlang, а не только Emscripten/C++.
no subject
Date: 2015-04-22 01:58 am (UTC)no subject
Date: 2015-04-22 02:18 am (UTC)no subject
Date: 2015-04-22 05:56 am (UTC)no subject
Date: 2015-04-22 04:27 am (UTC)https://www.destroyallsoftware.com/talks/wat
Я сегодня смотрел :)
no subject
Date: 2015-04-22 05:24 pm (UTC)no subject
Date: 2015-04-24 04:50 pm (UTC)no subject
Date: 2015-04-24 05:19 pm (UTC)Насчёт «неестественно» – у меня ровно противоположное мнение. Я как раз считаю, что конечные автоматы удобнее и понятнее, чем трэды, если есть подходящий инструмент. Обычно это удачный DSL (регэкспы, $.my опять же) или заточенный под конечные автоматы язык программирования (Erlang).
Хотя пословицу «всяк кулик своё болото хвалит» никто не отменял.
Главная то беда в том, что конечные автоматы на практике не всегда удобны, а иногда и просто неприменимы из-за возникающего оверхэда. Вот для этих редких хадач трэды и нужны.
no subject
Date: 2015-04-24 05:59 pm (UTC)Мне не верится, что автоматы могут быть легче для восприятия, чем императивный код. Покажи хоть один нетривиальный пример.
Например, покажи мне, как твоё волшебноё болото сгенерирует конечный автомат для вот такого куска:
Я хочу исполнять это в фоновом режиме, выполняя лишь 1 строку со стейтментом (S1, S2... S9) по каждому вызову таймера (мне специально задержки не нужны, но я буду возвращаться после каждого statement'а, чтобы не блокировать UX).
В случае фонового треда, я бы просто написал этот кусок как есть. В случае обработчика таймера... мне даже не хочется думать, какое уродство туда придётся зафигачить :)
no subject
Date: 2015-04-24 06:07 pm (UTC)http://programmers.stackexchange.com/a/110206
Не такое уж и уродство кста получается, если S[] – это список функций.
no subject
Date: 2015-04-24 06:12 pm (UTC)no subject
Date: 2015-04-24 06:20 pm (UTC)Единственный более-менее нормальный выход это использование yield (пишешь императивный код, а компилятор/интерпретатор всё делает за тебя).
no subject
Date: 2015-04-24 06:30 pm (UTC)Энкапсулирование состояний элементарно делается замыканиями (это, правда, ой недёшево – замыкания то подороже стеков обходятся).
С появлением promise как общего соглашения картинка кста существенно упростилась и код с длинными асинхронными цепочками/графами переходов состояний стал приемлемо (и даже легко) читаться.
no subject
Date: 2015-04-24 06:53 pm (UTC)no subject
Date: 2015-04-24 07:06 pm (UTC)Такое плохо читается, по-твоему? Это несколько псевдокод, но сейчас вот так дела обстоят.
no subject
Date: 2015-04-25 11:11 pm (UTC)Сложности возникают вот когда: когда структура достаточно сложна, чтобы вот так структурно inline её нельзя было записать, и создание лямбд и замыканий выносят в отдельные циклы и хелперы. Это, казалось бы, не должно принципиально отличаться от обычного разбития кода на функции, но в силу крайней неочевидности интерфейсов (что куда передаётся и зачем), а также гибкости (дефинируй что хочешь где хочешь) реальный код трудночитаем. Отдельные трудности возникают, когда разные коллбеки вживаются в данные, т.е. на каком-то уровне ты работаешь с массивом коллбеков, в которых масса implied assumption, но вся эта информация не прописана. Нужно медленно и внимательно читать весь код, строить в голове весь этот огромный граф и соединять нужные рёбра графа.
Наверное, нужен пример чуть больше, чем тривиальный, чтобы это показать.
no subject
Date: 2015-04-26 11:28 am (UTC)Код, который писали, натягивая за уши функциональный стиль, да на неприспособленном языке – читается как говно. Два прекрасных примера – php и java. Там да, код в таком стиле – просто кровавое месиво.
Насчёт коллбэков: коллбэки как конструкции – вообще обычно зло. Сравни:
против
Во втором случае аж два «коллбэка» плюс обработка ошибок decoupled от самих функций.
Промисы проще читаются, в них проще обрабатывать ошибки и обычно понятно, что куда передаётся. Они, правда, довольно дорогие.
Не понял насчёт создания лямбд не инлайном – лямбда же просто стрелка, как её можно не инлайном? Её ж именовать придётся.