Войти на сайт

Авторизация, ждите ...
×

ТЕМА: Аналог Fiber

Аналог Fiber 8 года 4 мес. назад #88216

  • DK
  • DK аватар
  • Вне сайта
  • Светлый дракон
  • DKPlugins
  • Сообщений: 946
  • Спасибо получено: 1129
  • Даритель СтимкеяПроект месяца 2 местоПроект месяца 3 местоРазработчикОраторВетеран2 место ПаладинПроект месяца 1 местоУчитель
Есть аналог Fiber в JS ?
Администратор запретил публиковать записи гостям.

Аналог Fiber 8 года 4 мес. назад #88217

  • Iren_Rin
  • Iren_Rin аватар
  • Вне сайта
  • Мастер
  • Сообщений: 247
  • Спасибо получено: 537
  • УчительКоммерсантПроект месяца 1 местоПроект года 1 местоПрограммист Ruby
Настоящего параллельного исполнения нет. Но можно сделать свое асинхронное исполнение, к примеру при помощи setTimeout.
setTimeout(function() {
  //do awesome job here
}, 0)
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DK

Аналог Fiber 8 года 4 мес. назад #88239

  • EvilCat
  • EvilCat аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 469
  • Спасибо получено: 850
  • 3 место Готв2 место Учитель
setTimeout следует использовать с осторожностью... Я, к сожалению, не до конца поняла, что такое Fiber. Если объясните, попробую подобрать аналог в JS - я на асинхронных операциях успела собаку съесть.
Администратор запретил публиковать записи гостям.

Аналог Fiber 8 года 4 мес. назад #88240

  • Волчонок
  • Волчонок аватар
  • Вне сайта
  • Просветлённый
  • Волчонок
  • Сообщений: 277
  • Спасибо получено: 247
  • 3 местоОрганизатор конкурсов3 место в Кодировке2 место
EvilCat пишет:
я на асинхронных операциях успела собаку съесть.

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

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

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]
Администратор запретил публиковать записи гостям.

Аналог Fiber 8 года 4 мес. назад #88241

  • Iren_Rin
  • Iren_Rin аватар
  • Вне сайта
  • Мастер
  • Сообщений: 247
  • Спасибо получено: 537
  • УчительКоммерсантПроект месяца 1 местоПроект года 1 местоПрограммист Ruby
EvilCat пишет:
setTimeout следует использовать с осторожностью... Я, к сожалению, не до конца поняла, что такое Fiber. Если объясните, попробую подобрать аналог в JS - я на асинхронных операциях успела собаку съесть.
Имеется ввиду запуск исполнения кода блока (функции) в параллельном потоке.
Администратор запретил публиковать записи гостям.

Аналог Fiber 8 года 4 мес. назад #88246

  • EvilCat
  • EvilCat аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 469
  • Спасибо получено: 850
  • 3 место Готв2 место Учитель
Разве настоящая параллельность возможна в таких средах как игры?

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

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

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

Аналог Fiber 8 года 4 мес. назад #88249

  • EvilCat
  • EvilCat аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 469
  • Спасибо получено: 850
  • 3 место Готв2 место Учитель
Я немного почитала про Fiber, и похоже, что это то, что я думаю: не параллельное исполнение, а прерываемое. Я работала с этим в php - если точнее, то мой текущий проект сейчас переходит на эту технологию как на основной метод работы.

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

Аналог Fiber 8 года 4 мес. назад #88255

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

Аналог Fiber 8 года 4 мес. назад #88258

  • EvilCat
  • EvilCat аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 469
  • Спасибо получено: 850
  • 3 место Готв2 место Учитель
Я имею в виду не простой компьютера, а программы. Я знаю, что если в том же node.js задать запрос к БД, то тот будет выполняться там, где-то, другой программой - параллельно, а потом вызовет в программе node.js событие "задача закончена"... Но событие ведь будет обработано не посреди выполнения другого кода, между строчками, а когда код перестанет блокировать. Значит, обработка события не будет параллельной.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DK

Аналог Fiber 8 года 4 мес. назад #88265

  • Amphilohiy
  • Amphilohiy аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 547
  • Спасибо получено: 666
  • ОраторПрограммист RubyУчительПобедитель Сбитой кодировки2 место Готв
Subzeroy пишет:
Есть аналог Fiber в JS ?
Кто-то знает про Fiber! Слава госпади, я их не выдумал!
Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DeadElf79, DK, Ren310

Аналог Fiber 8 года 4 мес. назад #88271

  • Iren_Rin
  • Iren_Rin аватар
  • Вне сайта
  • Мастер
  • Сообщений: 247
  • Спасибо получено: 537
  • УчительКоммерсантПроект месяца 1 местоПроект года 1 местоПрограммист Ruby
EvilCat пишет:
Разве настоящая параллельность возможна в таких средах как игры?

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

Аналог Fiber 8 года 4 мес. назад #88272

  • Lekste
  • Lekste аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 911
  • Спасибо получено: 565
  • Программист JavaScript ОраторПрограммист RubyДаритель СтимкеяВетеран
Вроде же в ноде как-раз между строчками и выполняется параллельные операции. Истекает лимит, состояние сохраняется и продолжается потом с момента прерывания. Или это только с обработкой тяжелых запросов так?

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

Аналог Fiber 8 года 4 мес. назад #88281

  • EvilCat
  • EvilCat аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 469
  • Спасибо получено: 850
  • 3 место Готв2 место Учитель
Нет, Generator - это совершенно другое. Фактически это функция, тело которой может быть поставлено на паузу. Но она не начинает выполняться внезапно сама по себе - а только когда объект генератора получает команду next(); и выполняется, пока не достигнет конца или yield, после чего выполнение возвращается на ту строчку, которая вызвала next(). Также генераторы можно использовать в циклах, для чего они изначально и предназначались - отсюда такое название. Представляю, как бы генератор "хорошо" работал поставщиком цикла, если бы выполнялся параллельно и независимо от процесса, в котором проводится цикл!

Вот пример, как генераторы трудятся у меня на основном проекте (в php):
	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 можно даже использовать как точку получения данных от среды (старшего кода), но здесь этого просто не требуется.

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



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

Аналог Fiber 8 года 4 мес. назад #88283

  • DK
  • DK аватар
  • Вне сайта
  • Светлый дракон
  • DKPlugins
  • Сообщений: 946
  • Спасибо получено: 1129
  • Даритель СтимкеяПроект месяца 2 местоПроект месяца 3 местоРазработчикОраторВетеран2 место ПаладинПроект месяца 1 местоУчитель
Да, кажется Genarator и Fiber по описанию одно и тоже. Вот я спор открыл :)
Администратор запретил публиковать записи гостям.

Аналог Fiber 8 года 4 мес. назад #88297

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

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

Аналог Fiber 8 года 4 мес. назад #88298

  • EvilCat
  • EvilCat аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 469
  • Спасибо получено: 850
  • 3 место Готв2 место Учитель
Это особенности php. Если в Яваскрипте функция-генератор объявляется явно за счёт звёздочки, то в php таковой её делает присутствие yield. И если уж есть хоть один yield, то return может вызываться только без аргумента - для досрочного закрытия генератора. Если такового закрытия нет, то генератор закрывается после последней строчки. Это ограничение на использование return присутствует потому, что такая функция на самом деле озвращает объект-генератор. Согласна, что синтаксический сахар мог бы быть и послаще.

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