Сообщение Re[11]: Почему Эрланг от 09.06.2015 13:55
Изменено 09.06.2015 14:53 Pauel
Здравствуйте, vdimas, Вы писали:
V>Ну, вообще, самый большой плюс от future — это то, что они являются еще и монадами maybe {result, error}, с распространением исключений по всей связанной цепочке (в будущих расширениях, типа future::then). Да, на этом можно строить иерархии задач (графов агентов) с автоматическим распространением ошибки к некоему "корню".
Это не плюс, это собственно "по определению". Выполнение асинхронного кода идет кусочками, соответсвенно связь между цепочками это основной поток(flow) вычисления + поток(flow) ошибок. Т.е. ровно то же, что и унутре каждой цепочки.
Собственно отсюда и растут проблемы с глобальным состоянием.
Вот, например
Код выглядит как синхронный, но на самом деле он может быть и асинхронным. Проблемы с глобальным состоянием во весь рост — те самые гонки, "которых нет". Теперь пример сложнее
Здесь тоже не ясно, что к чему. Скажем, если унутре короутины, то снова получаем асинхронный код. И снова проблемы с глобальным состоянием во весь рост — те самые гонки, "которых нет".
Предположим, readFile бросает исключение и код синхронный. Все в порядке — заходим и в catch, и в finally
А если код асинхронный — почему должно быть как то иначе ?
Теперь про агентов — в коде выше в асинхронном варианте в обоих вариантах есть гонки, это общая проблема любой многозадачности, а не так, как думают сельские крымские разработчики (только в вытесняющей)
На одних только then никаких агентов не построишь. Агенты строятся исключительно за счет изолирования глобального состояния. then это всего лишь связывание цепочек, никакого отношения к изолированому состоянию оно не имеет. Более того, изолированое состояние требуют обмен сообщениями, что, в сумме означает следующее — никаких then вообще не нужно для агентов основаных на монаде Future/Promise и тд.
Вместо этого нужны обычные эвенты и очереди вызовов. Что будет унутре очереди и на чем она будет построена — вообще дело десятое.
V>Ну, вообще, самый большой плюс от future — это то, что они являются еще и монадами maybe {result, error}, с распространением исключений по всей связанной цепочке (в будущих расширениях, типа future::then). Да, на этом можно строить иерархии задач (графов агентов) с автоматическим распространением ошибки к некоему "корню".
Это не плюс, это собственно "по определению". Выполнение асинхронного кода идет кусочками, соответсвенно связь между цепочками это основной поток(flow) вычисления + поток(flow) ошибок. Т.е. ровно то же, что и унутре каждой цепочки.
Собственно отсюда и растут проблемы с глобальным состоянием.
Вот, например
var x = readFile('path')
var i = readGlobalState(x);
var y = ajaxPost(x);
writeGlobalState(i);
return toJson(y);
Код выглядит как синхронный, но на самом деле он может быть и асинхронным. Проблемы с глобальным состоянием во весь рост — те самые гонки, "которых нет". Теперь пример сложнее
try{
var x = readFile('path')
var i = readGlobalState(x);
var y = ajaxPost(x);
writeGlobalState(i);
return toJson(y);
} catch(e) {
return errorToJson(e);
} finally() {
writeGlobalState(i);
}
Здесь тоже не ясно, что к чему. Скажем, если унутре короутины, то снова получаем асинхронный код. И снова проблемы с глобальным состоянием во весь рост — те самые гонки, "которых нет".
Предположим, readFile бросает исключение и код синхронный. Все в порядке — заходим и в catch, и в finally
А если код асинхронный — почему должно быть как то иначе ?
Теперь про агентов — в коде выше в асинхронном варианте в обоих вариантах есть гонки, это общая проблема любой многозадачности, а не так, как думают сельские крымские разработчики (только в вытесняющей)
На одних только then никаких агентов не построишь. Агенты строятся исключительно за счет изолирования глобального состояния. then это всего лишь связывание цепочек, никакого отношения к изолированому состоянию оно не имеет. Более того, изолированое состояние требуют обмен сообщениями, что, в сумме означает следующее — никаких then вообще не нужно для агентов основаных на монаде Future/Promise и тд.
Вместо этого нужны обычные эвенты и очереди вызовов. Что будет унутре очереди и на чем она будет построена — вообще дело десятое.
Re[11]: Почему Эрланг
Здравствуйте, vdimas, Вы писали:
V>Ну, вообще, самый большой плюс от future — это то, что они являются еще и монадами maybe {result, error}, с распространением исключений по всей связанной цепочке (в будущих расширениях, типа future::then). Да, на этом можно строить иерархии задач (графов агентов) с автоматическим распространением ошибки к некоему "корню".
Это не плюс, это собственно "по определению". Выполнение асинхронного кода идет кусочками, соответсвенно связь между цепочками это основной поток(flow) вычисления + поток(flow) ошибок. Т.е. ровно то же, что и унутре каждой цепочки.
Собственно отсюда и растут проблемы с глобальным состоянием.
Вот, например
Код выглядит как синхронный, но на самом деле он может быть и асинхронным. Проблемы с глобальным состоянием во весь рост — те самые гонки, "которых нет". Теперь пример сложнее
Здесь тоже не ясно, что к чему. Скажем, если унутре короутины, то снова получаем асинхронный код. И снова проблемы с глобальным состоянием во весь рост — те самые гонки, "которых нет".
Предположим, readFile бросает исключение и код синхронный. Все в порядке — заходим и в catch, и в finally
А если код асинхронный — почему должно быть как то иначе ?
Теперь про агентов — в коде выше в асинхронном варианте в обоих вариантах есть гонки, это общая проблема любой многозадачности, а не так, как думают сельские крымские разработчики (только в вытесняющей)
На одних только then никаких агентов не построишь. Агенты строятся исключительно за счет изолирования состояния. then это всего лишь связывание цепочек, никакого отношения к изолированому состоянию оно не имеет. Как видно, асинхронные варианты выше имеют в полный рост проблемы с глобальным состоянием. Далее, изолированое состояние требуют обмен сообщениями, что, в сумме означает следующее — никаких then вообще не нужно для агентов основаных на монаде Future/Promise и тд.
Вместо этого нужны обычные эвенты и очереди вызовов. Что будет унутре очереди и на чем она будет построена — вообще дело десятое.
V>Ну, вообще, самый большой плюс от future — это то, что они являются еще и монадами maybe {result, error}, с распространением исключений по всей связанной цепочке (в будущих расширениях, типа future::then). Да, на этом можно строить иерархии задач (графов агентов) с автоматическим распространением ошибки к некоему "корню".
Это не плюс, это собственно "по определению". Выполнение асинхронного кода идет кусочками, соответсвенно связь между цепочками это основной поток(flow) вычисления + поток(flow) ошибок. Т.е. ровно то же, что и унутре каждой цепочки.
Собственно отсюда и растут проблемы с глобальным состоянием.
Вот, например
var x = readFile('path')
var i = readGlobalState(x);
var y = ajaxPost(x);
writeGlobalState(i);
return toJson(y);
Код выглядит как синхронный, но на самом деле он может быть и асинхронным. Проблемы с глобальным состоянием во весь рост — те самые гонки, "которых нет". Теперь пример сложнее
try{
var x = readFile('path')
var i = readGlobalState(x);
var y = ajaxPost(x);
writeGlobalState(i);
return toJson(y);
} catch(e) {
return errorToJson(e);
} finally() {
writeGlobalState(i);
}
Здесь тоже не ясно, что к чему. Скажем, если унутре короутины, то снова получаем асинхронный код. И снова проблемы с глобальным состоянием во весь рост — те самые гонки, "которых нет".
Предположим, readFile бросает исключение и код синхронный. Все в порядке — заходим и в catch, и в finally
А если код асинхронный — почему должно быть как то иначе ?
Теперь про агентов — в коде выше в асинхронном варианте в обоих вариантах есть гонки, это общая проблема любой многозадачности, а не так, как думают сельские крымские разработчики (только в вытесняющей)
На одних только then никаких агентов не построишь. Агенты строятся исключительно за счет изолирования состояния. then это всего лишь связывание цепочек, никакого отношения к изолированому состоянию оно не имеет. Как видно, асинхронные варианты выше имеют в полный рост проблемы с глобальным состоянием. Далее, изолированое состояние требуют обмен сообщениями, что, в сумме означает следующее — никаких then вообще не нужно для агентов основаных на монаде Future/Promise и тд.
Вместо этого нужны обычные эвенты и очереди вызовов. Что будет унутре очереди и на чем она будет построена — вообще дело десятое.