Здравствуйте, Ikemefula, Вы писали:
V>>Ну, вообще, самый большой плюс от future — это то, что они являются еще и монадами maybe {result, error}, с распространением исключений по всей связанной цепочке (в будущих расширениях, типа future::then). Да, на этом можно строить иерархии задач (графов агентов) с автоматическим распространением ошибки к некоему "корню".
I> Это не плюс, это собственно "по определению".
Это просто инструмент, которым можно вот этот конкретный сценарий, совпадающий с путем распространения ошибки "по-умолчанию", решить задешево. Но в реальной жизни приходится пути распространения ошибок корректировать.
I>Выполнение асинхронного кода идет кусочками, соответсвенно связь между цепочками это основной поток(flow) вычисления + поток(flow) ошибок. Т.е. ровно то же, что и унутре каждой цепочки.
Это можно сказать и про синхронный код, про каждый вызов АПИ ОС. Не в этом дело.
I>Собственно отсюда и растут проблемы с глобальным состоянием.
Если честно, я плохо понимаю, откуда ты постоянно берешь своё "глобальное состояние".
I>Вот, например
I>I>var x = readFile('path')
I>var i = readGlobalState(x);
I>var y = ajaxPost(x);
I>writeGlobalState(i);
I>return toJson(y);
I>
I>Код выглядит как синхронный, но на самом деле он может быть и асинхронным. Проблемы с глобальным состоянием во весь рост — те самые гонки, "которых нет". Теперь пример сложнее
Не надо. Ты приводишь нелепые сниппеты на нелепых языках на нелепых фреймворках. Мы и так знаем, что там всё не просто ))
Да, у JS есть такая страшная хрень как "контекст", это такая же точно гиря как в случае с Лиспом и все побочные эффекты от "контекста" были известны еще десятки лет назад. Я рад, что ты, наконец, открываешь эти эффекты для себя.
I>Теперь про агентов — в коде выше в асинхронном варианте в обоих вариантах есть гонки, это общая проблема любой многозадачности, а не так, как думают сельские крымские разработчики (только в вытесняющей)
Тебе уже сотни раз рекомендовалось поинтересоваться, что есть "гонки". Ты называешь этим термином нечто, что уже 3-й год весь форум не в состоянии идентифицировать.
Например, даже любимый твой Майкрософт в доках пишет, что кооперативная многозадачность позволяется избегать лишних гонок и лишних же блокировок. Но у тебя как был затык в понимании "гонок", так и не рассосался до сих пор. И ведь не страшно же тебе на весь интернет так подставляться, не? )) С работы не уволят, случаем? ))
I>На одних только then никаких агентов не построишь.
Ну ващет, построишь, там же на них можно ветвится — это же бинарная монада, т.е. можно сэмулировать тьюринг-полную систему, а далее ты в курсе.
I>Агенты строятся исключительно за счет изолирования состояния.
Потеки сознания.
А инкапсуляция состояния в обычных объектах — без изолирования? ))
Агенты — это сугубо парадигма и ничего более. Простая парадигма, надо сказать. Покурить её сам на этот раз сходишь или отправить?))
I>then это всего лишь связывание цепочек
Наоборот — для разрывания последовательных операций
Вот ты жжешь, коллега...
Берем некий изначально "непрерывный" алгоритм, режем этот алгоритм на куски с помощью then (в дотнете Task.ContinueWith, которое генерит компилятор на месте await).
И все это с единственной целью — уйти от вытесняющей ядерной многозадачности в сторону кооперативной юзверской.
I>Как видно, асинхронные варианты выше имеют в полный рост проблемы с глобальным состоянием.
Очередные потеки.