Аналог Fiber

Разработчик Программист JavaScript Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место Учитель Оратор Ветеран Даритель Стимкея 2 место Программист Ruby Паладин
Больше
10 года 4 мес. назад #88216 от DK
DK создал тему: Аналог Fiber
Есть аналог Fiber в JS ?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Коммерсант Проект года 1 место Учитель Проект месяца 1 место
Больше
10 года 4 мес. назад #88217 от Iren_Rin
Iren_Rin ответил в теме Аналог Fiber
Настоящего параллельного исполнения нет. Но можно сделать свое асинхронное исполнение, к примеру при помощи setTimeout.
Code:
setTimeout(function() { //do awesome job here }, 0)
Спасибо сказали: DK

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

3 место Готв Учитель 2 место
Больше
10 года 4 мес. назад #88239 от EvilCat
EvilCat ответил в теме Аналог Fiber
setTimeout следует использовать с осторожностью... Я, к сожалению, не до конца поняла, что такое Fiber. Если объясните, попробую подобрать аналог в JS - я на асинхронных операциях успела собаку съесть.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

3 место 3 место в Кодировке 2 место Организатор конкурсов
Больше
10 года 4 мес. назад #88240 от Волчонок
Волчонок ответил в теме Аналог Fiber

EvilCat пишет: я на асинхронных операциях успела собаку съесть.


:ohmy:

Ленивый волчонок с большими амбициями

Рассказ "Рождение мага" , периодически обновляется
РПГ История Егеря . Основной текущий проект.

ВНИМАНИЕ: Спойлер!

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Коммерсант Проект года 1 место Учитель Проект месяца 1 место
Больше
10 года 4 мес. назад #88241 от Iren_Rin
Iren_Rin ответил в теме Аналог Fiber

EvilCat пишет: setTimeout следует использовать с осторожностью... Я, к сожалению, не до конца поняла, что такое Fiber. Если объясните, попробую подобрать аналог в JS - я на асинхронных операциях успела собаку съесть.

Имеется ввиду запуск исполнения кода блока (функции) в параллельном потоке.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

3 место Готв Учитель 2 место
Больше
10 года 4 мес. назад #88246 от EvilCat
EvilCat ответил в теме Аналог Fiber
Разве настоящая параллельность возможна в таких средах как игры?

Например, запустил ты функцию:
Code:
some_global_var=2 var temp=some_global_var*2

И переменной temp может пристроиться что-то иное чем 4, если какой-нибудь параллельный поток изменил значение глобальной переменной? Насколько я знаю, обычно когда говорят о параллельности, то подразумевается, что "параллельные" задачи выполняются во время простоя, когда процесс не занят ничем другим. А идущие подряд команды всё равно идут подряд и ничем не прерываются.

Могу ошибаться, ведь несчастную собаку я съела на асинхронных операциях, а не параллельных %) Но их и правда часто путают.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

3 место Готв Учитель 2 место
Больше
10 года 4 мес. назад #88249 от EvilCat
EvilCat ответил в теме Аналог Fiber
Я немного почитала про Fiber, и похоже, что это то, что я думаю: не параллельное исполнение, а прерываемое. Я работала с этим в php - если точнее, то мой текущий проект сейчас переходит на эту технологию как на основной метод работы.

Похоже, в Яваскрипте есть точно такая же технология, поддерживаемая начиная с Хрома 39 (в МВ Хром 41). Почитать о ней можно здесь , но, увы, на английском.
Спасибо сказали: DeadElf79, DK

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Разработчик Программист JavaScript Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место Учитель Оратор Ветеран Даритель Стимкея 2 место Программист Ruby Паладин
Больше
10 года 4 мес. назад #88255 от DK
DK ответил в теме Аналог Fiber
Вроде js не поддерживает параллельные вычисления?
Не соглашусь, что параллельные задачи выполняются только при простое компьютера. Есть такой пример: Ссылка
Без распараллеливания во время подсчетов не был бы доступен интерфейс программы.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

3 место Готв Учитель 2 место
Больше
10 года 4 мес. назад #88258 от EvilCat
EvilCat ответил в теме Аналог Fiber
Я имею в виду не простой компьютера, а программы. Я знаю, что если в том же node.js задать запрос к БД, то тот будет выполняться там, где-то, другой программой - параллельно, а потом вызовет в программе node.js событие "задача закончена"... Но событие ведь будет обработано не посреди выполнения другого кода, между строчками, а когда код перестанет блокировать. Значит, обработка события не будет параллельной.
Спасибо сказали: DK

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby 2 место Готв Победитель Сбитой кодировки Учитель Оратор
Больше
10 года 4 мес. назад #88265 от Amphilohiy
Amphilohiy ответил в теме Аналог Fiber

Subzeroy пишет: Есть аналог Fiber в JS ?

Кто-то знает про Fiber! Слава госпади, я их не выдумал!

Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.
Спасибо сказали: DeadElf79, DK, Ren310

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Коммерсант Проект года 1 место Учитель Проект месяца 1 место
Больше
10 года 4 мес. назад - 10 года 4 мес. назад #88271 от Iren_Rin
Iren_Rin ответил в теме Аналог Fiber

EvilCat пишет: Разве настоящая параллельность возможна в таких средах как игры?

Например, запустил ты функцию:
...

А почему нет? Считается, что одно ядро процессора может обрабатывать два процесса однавременно, так что если архитектура игры позволяет, то почему бы и не запустить какую-нибудь работу в параллели? А проблема доступа к общим ресурсам (переменным) решается мьютексом. Вот например реализация мьютекса для руби
Последнее редактирование: 10 года 4 мес. назад пользователем Iren_Rin.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Ветеран Даритель Стимкея Оратор Программист JavaScript
Больше
10 года 4 мес. назад - 10 года 4 мес. назад #88272 от Lekste
Lekste ответил в теме Аналог Fiber
Вроде же в ноде как-раз между строчками и выполняется параллельные операции. Истекает лимит, состояние сохраняется и продолжается потом с момента прерывания. Или это только с обработкой тяжелых запросов так?

По крайней мере этот generator похоже так и работает.
Последнее редактирование: 10 года 4 мес. назад пользователем Lekste.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

3 место Готв Учитель 2 место
Больше
10 года 4 мес. назад - 10 года 4 мес. назад #88281 от EvilCat
EvilCat ответил в теме Аналог Fiber
Нет, Generator - это совершенно другое. Фактически это функция, тело которой может быть поставлено на паузу. Но она не начинает выполняться внезапно сама по себе - а только когда объект генератора получает команду next(); и выполняется, пока не достигнет конца или yield, после чего выполнение возвращается на ту строчку, которая вызвала next(). Также генераторы можно использовать в циклах, для чего они изначально и предназначались - отсюда такое название. Представляю, как бы генератор "хорошо" работал поставщиком цикла, если бы выполнялся параллельно и независимо от процесса, в котором проводится цикл!

Вот пример, как генераторы трудятся у меня на основном проекте (в php):
Code:
protected function auto_mode() { if ($this->is_cacheable()) yield new TemplateMode_cache($this); yield new \Pokeliga\Task\Need_call([$this, 'load_template_data']); if ($this->is_plain()) yield new TemplateMode_plain($this); elseif ($this->is_bakeable()) yield new TemplateMode_bake($this); else yield false; }

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

Но если шаблон не кэшируемый, то нужны дополнительные сведения, и генератор возвращает специальный объект, который результатом быть не может и, следовательно, является зависимостью. Среда смотрит на это, выполняет зависимость когда ей удобно и возвращает управление генератору только тогда, когда его нужда разрешена. Значит, что после строчки yield new... выполнение ставится на паузу, а потом продолжается, когда генератору говорят "продолжи!", со всем прежним контекстом. yield можно даже использовать как точку получения данных от среды (старшего кода), но здесь этого просто не требуется.

Без генератора это пришлось бы записывать как "ад колбэков" или, в моём случае, как объекты, где каждое место для паузы должно обеспечиваться кучей кода и складывания контекста в переменные объекта... Как и было, пока я не догадалась использовать генераторы для этой цели.

[hr]
Также я очень рада за возможность параллельных вычислений в Руби и игровых средах в принципе, но не похоже, что Fiber из этой оперы, потому что они описывается примерно теми же словами, как генератор, и ничего не говорит об изоляции переменных.
Последнее редактирование: 10 года 4 мес. назад пользователем EvilCat.
Спасибо сказали: Lekste, DK

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Разработчик Программист JavaScript Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место Учитель Оратор Ветеран Даритель Стимкея 2 место Программист Ruby Паладин
Больше
10 года 4 мес. назад #88283 от DK
DK ответил в теме Аналог Fiber
Да, кажется Genarator и Fiber по описанию одно и тоже. Вот я спор открыл :)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Ветеран Даритель Стимкея Оратор Программист JavaScript
Больше
10 года 4 мес. назад - 10 года 4 мес. назад #88297 от Lekste
Lekste ответил в теме Аналог Fiber
Котейка, а оно у тебя закрывается?
Ато было бы печально, если функция никогда не завершится и сохраненное состояние будет копиться с каждой проверяемой страницей.
Или там можно как-то досрочно закрыть выполнение функции через throw или какой-нибудь end?

И что-то я так и не понял, почему бы не использовать return'ы вместо yield?
Последнее редактирование: 10 года 4 мес. назад пользователем Lekste.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

3 место Готв Учитель 2 место
Больше
10 года 4 мес. назад #88298 от EvilCat
EvilCat ответил в теме Аналог Fiber
Это особенности php. Если в Яваскрипте функция-генератор объявляется явно за счёт звёздочки, то в php таковой её делает присутствие yield. И если уж есть хоть один yield, то return может вызываться только без аргумента - для досрочного закрытия генератора. Если такового закрытия нет, то генератор закрывается после последней строчки. Это ограничение на использование return присутствует потому, что такая функция на самом деле озвращает объект-генератор. Согласна, что синтаксический сахар мог бы быть и послаще.

Что касается того, что происходит с генератором, если он делает yield в начале и больше его никогда не спрашивают... Как только на объект-генаратор не остаётся ссылок, он уничтожается уборщиком мусора по обычным правилам и больше не занимает память.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.124 секунд
Работает на Kunena форум