|
2.17, лох (?), 09:48, 12/03/2013 [^] [^^] [^^^] [ответить] [↓] [п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б■╛ п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б∙■п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б┬ Б▄═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б√░п▒Б┬ Б√⌠я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б■°п▒Б┬≥Б∙■я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б√═Б√═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√⌠]
| +1 +/– |
> Ребята как можно в здравом уме и памяти применять клиентский язык на сервере?
1. Что такое "клиентский язык" ? Пожалуйста, определение.
2. Что такое "сервер"? Как относиться к запросам "серверного языка", например, к той же БД, к DNS, да хоть к файловой системе? Они серверные или нет?
> У него тысяча способов отстрелить себе ногу.
у каждого человека -- миллионы таких способов.
> Использование динамических языков на сервере я лично считаю очень плохим решением.
А что такое "динамический язык", видимо, некая противоположность "статическому"? Приведите пример "статического" языка и "хорошего решения".
Хотя, похоже, с вашими познаниями о языках лучше вам писать на форуме филфака.
| |
|
3.37, Michael Shigorin (ok), 14:46, 12/03/2013 [^] [^^] [^^^] [ответить] [п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б■╛ п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б∙■п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б┬ Б▄═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б√░п▒Б┬ Б√⌠я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б■°п▒Б┬≥Б∙■я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б√═Б√═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√⌠]
| +/– |
> Как относиться к запросам "серверного языка", например, к
> той же БД, к DNS, да хоть к файловой системе?
Относиться стоит сдержанно. :)
> Хотя, похоже, с вашими познаниями о языках лучше вам писать на форуме филфака.
При всём уважении -- но и у филфака нам можно поучиться языковой грамоте; http://tsya.ru
А вообще да, претензия к динамическим языкам была крайне невнятной.
| |
|
|
5.58, anonymous (??), 21:51, 12/03/2013 [^] [^^] [^^^] [ответить] [↑] [п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б■╛ п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б∙■п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б┬ Б▄═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б√░п▒Б┬ Б√⌠я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б■°п▒Б┬≥Б∙■я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б√═Б√═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√⌠]
| +1 +/– |
> Да ну всё это к лешему. Михаил лучше скажи, как человек посматривающий
> по сторонам, есть где тфтп с скриптованием по событию? Вот файлик
> залили - надо один скрипт пиннуть, слили другой - ещё один
> скрипт пнули.
Не Михаил, но тоже внесу свои 5 копеек - реализация протокола крайне простая, можно написать самому (или взять готовый модуль). Я когда озадачился этой проблемой, взял http://wiki.tcl.tk/12711 и дописал чуть кода. Заняло времени меньше, чем поиск готового решения =)
| |
|
|
|
|
|
|
3.26, Филипп Филиппович (ok), 11:08, 12/03/2013 [^] [^^] [^^^] [ответить] [↓] [п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б■╛ п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б∙■п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б┬ Б▄═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б√░п▒Б┬ Б√⌠я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б■°п▒Б┬≥Б∙■я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б√═Б√═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√⌠]
| +3 +/– |
Посмотрел на https://github.com/caolan/async/blob/master/test/test-async.js. По первому впечатлению, тоже не очень удобно. В Twisted это делается с использованием defer.deferredGenerator, при этом пишется обычный код (локальные переменные, ветвления и циклы используются без ограничений), и только точки разрыва оформляются как yield. К сожалению, в JS нет языкового механизма, чтобы, сохранив стек и все переменные во всех областях видимости по этому стеку, продолжить выполнение в другом месте, а впоследствии вернуться. Что, вообще говоря, жаль. Впрочем, справедливости ради скажу, что Twisted, конечно, тоже не образец простоты... Но после однократного освоения такие вещи там делаются на порядок проще.
| |
|
4.33, _Vitaly_ (ok), 13:03, 12/03/2013 [^] [^^] [^^^] [ответить] [↓] [↑] [п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б■╛ п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б∙■п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б┬ Б▄═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б√░п▒Б┬ Б√⌠я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б■°п▒Б┬≥Б∙■я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б√═Б√═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√⌠]
| +1 +/– |
> Посмотрел на https://github.com/caolan/async/blob/master/test/test-async.js. По
> первому впечатлению, тоже не очень удобно. В Twisted это делается с
> использованием defer.deferredGenerator, при этом пишется обычный код (локальные переменные,
> ветвления и циклы используются без ограничений), и только точки разрыва оформляются
> как yield. К сожалению, в JS нет языкового механизма, чтобы, сохранив
> стек и все переменные во всех областях видимости по этому стеку,
> продолжить выполнение в другом месте, а впоследствии вернуться. Что, вообще говоря,
> жаль. Впрочем, справедливости ради скажу, что Twisted, конечно, тоже не образец
> простоты... Но после однократного освоения такие вещи там делаются на порядок
> проще.
Для ниасиляторов есть node-fibers. Но лично я таким советую php.
| |
|
5.46, Филипп Филиппович (ok), 19:01, 12/03/2013 [^] [^^] [^^^] [ответить] [↓] [п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б■╛ п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б∙■п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б┬ Б▄═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б√░п▒Б┬ Б√⌠я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б■°п▒Б┬≥Б∙■я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б√═Б√═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√⌠]
| +2 +/– |
> Для ниасиляторов есть node-fibers. Но лично я таким советую php.
Проблема совсем не в том, что это трудно "осилить". Человек, который "осиливает" сопрограммы, заведомо "осилит" и callback'и. Для этого не требуется семи пядей во лбу, сложного-то ничего в них нет. Проблема в том, что получается громоздко.
На чистом C тоже можно писать объектно-ориентированные программы, и их пишут, что характерно (и иногда это вполне оправданно). И до тех пор, пока не нужно сложных вещей, это будет работать, порой не хуже, чем на C++. Но когда потребуется выбор вызываемой функции в зависимости от реального класса объекта (не от типа указателя, а от того, что по этому указателю лежит), придётся изобретать замену готовому механизму виртуальных функций и каждый раз писать обращение к ней. Так и тут.
| |
|
4.60, anonymous (??), 21:59, 12/03/2013 [^] [^^] [^^^] [ответить] [↑] [п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б■╛ п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б∙■п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б┬ Б▄═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б√░п▒Б┬ Б√⌠я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б■°п▒Б┬≥Б∙■я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б√═Б√═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√⌠]
| +1 +/– |
> Посмотрел на https://github.com/caolan/async/blob/master/test/test-async.js. По
> первому впечатлению, тоже не очень удобно. В Twisted это делается с
> использованием defer.deferredGenerator, при этом пишется обычный код (локальные переменные,
> ветвления и циклы используются без ограничений), и только точки разрыва оформляются
> как yield. К сожалению, в JS нет языкового механизма, чтобы, сохранив
> стек и все переменные во всех областях видимости по этому стеку,
> продолжить выполнение в другом месте, а впоследствии вернуться. Что, вообще говоря,
> жаль. Впрочем, справедливости ради скажу, что Twisted, конечно, тоже не образец
> простоты... Но после однократного освоения такие вещи там делаются на порядок
> проще.
Если уж зашла речь об асинхронно-событийной парадигме, то не стоит ли попробовать, к примеру, Tcl? Очень сильно развитая часть языка, при этом, использовать ее действительно просто. При этом, язык не столь экзотичен, как erlang (функциональное программирование все же многим людям непривычно). Если нравится использовать coroutine и yield - смотрите сразу на ветку 8.6, хотя я использую преимущественно 8.5 без yield и программировать все равно удобно.
| |
|
5.68, Филипп Филиппович (ok), 10:33, 13/03/2013 [^] [^^] [^^^] [ответить] [↑] [п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б■╛ п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б∙■п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б┬ Б▄═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б√░п▒Б┬ Б√⌠я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б■°п▒Б┬≥Б∙■я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б√═Б√═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√⌠]
| +/– |
Erlang, кстати, мне очень нравится и к некоторым задачам моей команды подходит идеально. И вообще есть мечта пописАть на функциональном языке. А в Erlang, помимо функциональной парадигмы, есть ещё и очень эффективный параллелизм с легковесными процессами, которые можно создавать тысячами.
К сожалению, трудно это намерение воплотить в жизнь по работе, т.к. не очень правильно писАть на том, что мало кто в компании знает, если это не даёт какого-то уж очень радикального выигрыша. А радикального не даёт, увы. Так уж вышло, что по работе мне вообще регулярно приходится убеждать людей не делать того, что самому хотелось бы (например, недавно один весьма уважаемый мною разработчик из другого отдела хотел прикрутить к проекту Haskell; это было бы очень красиво, но я его отговорил: ради той мелочи, которая была ему нужна, добавлять к проекту ещё один язык, тем более довольно "эзотерический", было бы не очень разумно). И, если уж поступать честно, то и самому приходится от подобных вывертов воздерживаться.
| |
|
|
|
|
3.27, Филипп Филиппович (ok), 11:10, 12/03/2013 [^] [^^] [^^^] [ответить] [п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б■╛ п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б∙■п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б┬ Б▄═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б√░п▒Б┬ Б√⌠я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б■°п▒Б┬≥Б∙■я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б√═Б√═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√⌠]
| +3 +/– |
> Что за хрень вы несёте, в вашем twisted всё на обычных deffered
> объектах с такими же колбэками. На сколько мне известно вообще не
> существует других способов писать асинхронный код нежели использовать колбэки.
О, прибежал типичный опеннетчик. Выучить Twisted времени нет, Питона толком не знает, а вот про хрень порассуждать и похамить всегда готов. Погуглите defer.deferredGenerator. Внутри там, конечно, callback'и, но снаружи это вообще не видно.
| |
|
|
5.45, Филипп Филиппович (ok), 18:48, 12/03/2013 [^] [^^] [^^^] [ответить] [↑] [п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б■╛ п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б∙■п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б┬ Б▄═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б√░п▒Б┬ Б√⌠я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б■°п▒Б┬≥Б∙■я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б√═Б√═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√⌠]
| +/– |
greenlets -- это то, что используется в gevent. И это ещё одно решение с близкими к Twisted функциями. То, что в Twisted сделано чисто Питоновскими сопрограммами на генераторах, там сделано на более низком уровне. И везде есть свои преимущества.
На gevent/greenlets, по моему опыту, пишется легче, но отлаживается тяжелее (хотя IntelliJ Pycharm с некоторых пор умеет отлаживать такой код, большинство отладчиков не могут), а анализ покрытия кода тестами иногда выдаёт феерический бред. На Twisted код более громоздкий, но тестируется сравнительно легко. Утверждается, что gevent в связке с gunicorn позволяет эффективно параллелить работу, но этого я не делал, не было реальной нужды.
В общем, дело вкуса. Для обычных задач лично я больше люблю gevent, но для очень ответственных с параноидальными требованиями по надёжности -- Twisted.
| |
|
|
|
|
3.36, Andrey (??), 13:47, 12/03/2013 [^] [^^] [^^^] [ответить] [п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б■╛ п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б∙■п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б┬ Б▄═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б√░п▒Б┬ Б√⌠я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б■°п▒Б┬≥Б∙■я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б√═Б√═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√⌠]
| +2 +/– |
С помощью Reactive Extensions писать сложную бизнес логику проще чем на генераторах. Хотя это скорее не конкурирующий технологии, а приёмы, которые друг друга дополняют:
https://github.com/Reactive-Extensions/RxJS
Пример кода, который:
1. Читает данные из сокета
2. Находит сообщения в формате FIX и транслирует их в JSON
3. Результаты склеивает в список
4. Результат пишет в сокет
FixPP.prototype.prettyPrint = function(req, res) {
req.readStream()
.toBuffer()
.select(this.findFixMessages.bind(this))
.concatObservable()
.subscribe(observerFromResponse(this.Rx, res));
};
Код асинхронный неблокирующий
Код легко покрывается тестами
Код представляет из себя набор простых операторов, которые ты собираешь как конструктор
Лично мне проще писать на JS чем на питоне, т.к. в JS есть нормальная лямбда
| |
|
|
5.56, Andrey (??), 20:37, 12/03/2013 [^] [^^] [^^^] [ответить] [п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б■╛ п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б■╢Б∙■п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б┬ Б▄═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б√░п▒Б┬ Б√⌠я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■я▐Б■°п▒Б┬≥Б∙■я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б√═Б√═п©б╘п╠Б∙≤п©Б∙═п▒Б┬≥Б┴╓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б√═Б∙⌡п▒Б■╢Б∙■п©Б√▓п▒Б■╛Б┴╔п▒Б√└Б∙▒я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б┬ Б∙░п▒Б√═Б■─я▐Б√░п▒Б┬ Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√▓п©б╘п▒Б┬ Б√⌠п©Б√▓п▒Б■╛б═п▒Б┬≥Б√▒п©Б√▓п▒Б■╛б═п▒Б┬ Б√⌠]
| +/– |
> что будет, если приедет невалидное из сокета или клиент просто отвалится?
> вообщем, где обработка ошибок?
Обработка ошибок - это как раз одна из сильных сторон Reactive Extensions. В моем примере ошибка будет пробрасываться по цепочке и в результате клиент получит ответ { status: "error", details: .... }
Например, можно создать функтор (failover), который перехватывает ошибки и повторяет попытку через время, и так, например, три раза, если ошибка не прекращается - увеличивает таймаут и т.д. Теперь этот функтор можно комбинировать с любой асинхронной операцией:
file.readAll().failover(times(3), sec(15))
socket.read().failover(times(10), sec(15))
topic.readMessages().failover(times(3), sec(3))
Дальше этот алгоритм можно покрыть тестами и прогнать их за одну милисекунду используя концепцию "виртуального времени" :). RX устроен таким образом, что вы не используете никаких Sleep-ов явно, а отправляете задачу в scheduler (ThreadPool, EventLoop, NewThread, Immediate ....) и указываете когда ее выполнить, поэтому в тестах как правило используется TestScheduler на котором время "течет" быстрее.
Библиотека спроектирована очень грамотно. Рекомендую ознакомительное видео http://channel9.msdn.com/Blogs/Charles/Erik-Meijer-Rx-in-15-Minutes
Всякие futures, async, promises - это частный случай RX.
Еще очень легко управлять временем жизни ресурсов. Что делать, например, если возникла ошибка внутри сложного алгоритма или клиент нажал кнопку отмена и надо отписаться от событий, освободить ресурсы, но это уже тема для отдельного разговора ...
| |
|
|
|
|
|