Pull to refresh

Асинхронное программирование: концепция Deferred

Reading time 7 min
Views 54K
Twisted *
Асинхронная концепция программирования заключается в том, что результат выполнения функции доступен не сразу же, а через некоторое время в виде некоторого асинхронного (нарушающего обычный порядок выполнения) вызова. Зачем такое может быть полезно? Рассмотрим несколько примеров.

Первый пример — сетевой сервер, веб-приложение. Чаще всего как таковых вычислений на процессоре такие приложения не выполняют. Большая часть времени (реального, не процессорного) тратится на ввод-вывод: чтение запроса от клиента, обращение к диску за данными, сетевые обращение к другим подсистемам (БД, кэширующие сервера, RPC и т.п.), запись ответа клиенту. Во время этих операций ввода-вывода процессор простаивает, его можно загрузить обработкой запросов других клиентов. Возможны различные способы решить эту задачу: отдельный процесс на каждое соединение (Apache mpm_prefork, PostgreSQL, PHP FastCGI), отдельный поток (нить) на каждое соединение или комбинированный вариант процесс/нить (Apache mpm_worker, MySQL). Подход с использованием процессов или нитей перекладывает мультиплексирование процессора между обрабатываемыми соединениями на ОС, при этом расходуется относительно много ресурсов (память, переключения контекста и т.п.), такой вариант не подходит для обработки большого количества одновременных соединений, но идеален для ситуации, когда объем вычислений достаточно высок (например, в СУБД). К плюсам модели нитей и процессов можно добавить потенциальное использование всех доступных процессоров в многопроцессорной архитектуре.
Читать дальше →
Total votes 54: ↑44 and ↓10 +34
Comments 24

Deferred: все подробности

Reading time 5 min
Views 13K
Twisted *
В предыдущей статье были описаны основные принципы работы Deferred и его применение в асинхронном программировании. Сегодня мы постараемся рассмотреть в деталях функционирование Deferred и примеры его использования.

Итак, Deferred — это отложенный результат, результат выполнения, который станет известен через некоторое время. Результатом, хранящимся в Deferred, может быть произвольное значение (успешное выполнение) или ошибка (исключение), которое произошло в процессе выполнения асинхронной операции. Раз нас интересует результат операции и мы получили от некоторой асинхронной функции Deferred, мы хотим выполнить действия в тот момент, когда результат выполнения будет известен. Поэтому Deferred кроме результата хранит еще цепочку обработчиков: обработчиков результатов (callback) и обработчиков ошибок (errback).
Читать дальше →
Total votes 18: ↑18 and ↓0 +18
Comments 18

Deferred для Javascript (Prototype)

Reading time 2 min
Views 3.3K
Website development *
Prototype and Twisted
Продолжая тему Deferred для JavaScript предлагаю еще одно переписывание Deferred, теперь в терминах Prototype. Подробнее о самом Deferred можно почитать в двух моих прошлых заметках: Асинхронное программирование: концепция Deferred и Deferred: все подробности. Если кратко, самое распространенное и полезное применение Deferred в JavaScript — это работа с AJAX или другими RPC-over-HTTP вызовами, когда необходимо совершить цепочку логически связанных вызовов, корректно обрабатывать возникающие ошибки и т.п. С моей точки зрения, Deferred крайне необходим в таких ситуациях.

Перейдем к примерам: обращение к некоторому JSON-RPC API на основе Prototype’овского Ajax.Request можеть быть обернуто в Deferred следующим образом:
Читать дальше →
Total votes 27: ↑24 and ↓3 +21
Comments 6

Сравнение нагрузки — PyCurl vs HTTPClientFactory+Deferred

Reading time 1 min
Views 2K
Python *
В процессе разработки одного проекта на Python+Twisted (распределителя СМС запросов) пришлось переписать вызов URL различных сервисов с разных серверов c блокирующего вызова через PyCurl на неблокирующий (client.HTTPClientFactory + deferred). Чтобы иметь перед глазами реальные данные, решил дать нагрузку и посмотреть на результаты

Читать дальше →
Total votes 33: ↑23 and ↓10 +13
Comments 19

Асинхронная синхронность. JSDeferred

Reading time 4 min
Views 6.3K
JavaScript *
В последнее время на хабре появилось несколько статей про работу с асинхронными вызовами (После всех асинхронных вызовов, Синхронизация асинхронных вызовов. WaitSync). Но при ближайшем рассмотрении область их применения довольно узка так как эти способы не решают всех проблем.
Но для начала попробуем определить эти самые проблемы, с которыми мы сталкиваемся при работе с асинхронными вызовами.
Читать дальше →
Total votes 48: ↑44 and ↓4 +40
Comments 31

Использование Deferred объектов в jQuery 1.5

Reading time 6 min
Views 37K
jQuery *
Translation
Deferred объекты появились в jQuery 1.5. Они позволяют отделить логику, которая зависит от результатов выполнения действия от самого действия. Для JavaScript Deferred объекты не новы, они уже были в MochiKit и Dojo, но с изменениями логики jQuery ajax от Julian Aubourg, внедрение Deferred объектов было неминуемо. С Deferred объектами несколько callback могут быть связаны с результатом задачи и любые из них могут быть привязаны к действию даже после начала его выполнения. Выполняемая задача может быть асинхронна, но не обязательно.

Deferred объекты теперь встроены в $.ajax() таким образом вы будете получать их автоматически. Обработчики теперь могут быть связаны с результатом следующим образом:
// $.get, ajax запрос, он асинхронный по умолчанию
var req = $.get('foo.htm')
   .success(function( response ){
      // что-нибудь делаем с ответом
   })
   .error(function(){
      // делаем что-нибудь если запрос провалился
   });
 
// это выполнится перед тем как $.get() будет выполнено
doSomethingAwesome();
 
// Делаем что-то ещё перед завершением запроса
req.success(function( response ){
   // делаем  что-то ещё с ответом
   // он будет выполнен когда запрос завершится, а если запрос завершен, то будет вызван немедленно
   // если запрос уже был выполнен
});

Читать дальше →
Total votes 116: ↑113 and ↓3 +110
Comments 19

jQuery Deferred Object (подробное описание)

Reading time 7 min
Views 119K
jQuery *
Sandbox
31 января вышел релиз jQuery 1.5, одним из ключевых нововведений которого стал инструмент Deferred Object. Именно о нём я и хочу рассказать подробнее в этой статье.

Эта новая функциональность библиотеки направлена на упрощение работы с отложенными (deferred) вызовами обработчиков (callbacks). Deferred Object, аналогично объекту jQuery, «цепочный» (chainable), но имеет свой набор методов. Deferred Object способен регистрировать множество обработчиков в очередь, вызывать зарегистрированные в очереди обработчики и переключать состояние на «завершено» или «ошибка» для синхронных или асинхронных функций.
Подробности и примеры далее
Total votes 98: ↑95 and ↓3 +92
Comments 16

Вышла версия jQuery 1.6 RC 1

Reading time 1 min
Views 447
jQuery *
Джон Резиг позавчера сообщил о выходе предпросмотровой версии будущей библиотеки jQuery 1.6.

Все заинтересованные программисты могут тотчас же скачать её да проверить, не хуже ли эта версия ведёт себя в их скриптах по сравнению с предыдущей. По-видимому, это одна из последних возможностей сообщить о багах, если что не так. Впереди ведь релиз.

Резиг прилагает довольно обширный список изменений в версии 1.6 RC 1, в основном сводящихся к исправлению ошибок (иногда довольно замысловатых), ко сглаживанию шероховатостей, к ускорению работы отдельных функций. Есть и заметные новинки. Помимо тех, которые я ужé упоминал в обзоре бета-версии, появилась возможность вызывать jQuery.noConflict() в любое время, а также новый метод jQuery.holdReady() для того, чтобы при необходимости можно было придержать наступление события ready.

Метод .animate() снабдили поддержкою deferred-интерфейса (см. [1], [2]), так что делается возможным простое навешивание такой функции, которая должна сработать опосля завершения всех анимаций:
$.when(
   $elements.animate(properties),
   $elements2.animate(properties2),
   …
).then(function(){
   …
});

Вы наверняка согласитесь, что эта новинка необыкновенно приятна, потому что совершенно избавляет в таких случаях от необходимости возёхаться.
Total votes 64: ↑47 and ↓17 +30
Comments 25

XNA Draw: пишем отложенное освещение на три источника с помощью шейдера

Reading time 7 min
Views 18K
Game development *C# *
Tutorial
Привет хабравчанам!

Давненько я не писал на хабр: учеба, сессия надвигается, сами понимаете. Сегодня я попробую рассказать, как в XNA реализовать Deferred Lighting (отложенное освещение) с использованием normal mapping на три источника света, при этом использовать мы будем Reach-профиль и Shader model 2.0.
Напомню, раньше мы уже затрагивали тему шейдеров: тут. Остальное под катом, видео и демо там же.
Читать дальше →
Total votes 68: ↑63 and ↓5 +58
Comments 23

«Сделайте мне красиво!» Выпуск №37

Reading time 1 min
Views 1.2K
Lumber room
Вашему вниманию очередной выпуск подкаста о веб-разработке «Сделайте мне красиво!»

Show notes:



Наши ссылки: RSS и лента на rpod.ru (лента прешоу)
Total votes 8: ↑4 and ↓4 0
Comments 4

«Сделайте мне красиво!» Выпуск №39

Reading time 1 min
Views 1.6K
Lumber room
Вашему вниманию очередной выпуск подкаста о веб-разработке «Сделайте мне красиво!»

Show notes:



Наши ссылки: RSS и лента на rpod.ru (лента прешоу)
Total votes 8: ↑6 and ↓2 +4
Comments 0

eachDeferred — отложенная обработка коллекции, one by one

Reading time 2 min
Views 2K
Website development *JavaScript *jQuery *
Tutorial
Sandbox
В ходе разработки текущего энтерпрайз-проекта, понадобилось реализовать отложенную обработку коллекции элементов jQuery — имелся набор виджетов, содержимое которых нужно было загрузить по очереди, причем загрузка происходила асинхронно. Пришлось написать небольшое расширение к $.fneachDeferred.
Читать дальше →
Total votes 5: ↑4 and ↓1 +3
Comments 7

Асинхронные API и объект Deferred в деталях

Reading time 11 min
Views 20K
JavaScript *Node.JS *
Tutorial
Sandbox
Большинство современных языков программирования позволяют использовать асинхронно выполняемые блоки кода. Вместе с гибкостью, получаемой при использовании асинхронного подхода, рискнувший его применить также получает более сложный для понимания и поддержки код. Однако, любое усложнение, с которым сталкиваются программисты, как правило, находит практическое решение в виде нового подхода или повышения уровня абстракции. В случае асинхронного программирования таким средством служит объект типа отложенный результат или deferred (англ. deferred — отложенный, отсроченный).

В статье будет рассказано о базовых подходах к возврату асинхронных результатов, функциях обратного вызова, объектах deferred и их возможностях. Будут приведены примеры на языке JavaScript, а также произведён разбор типового объекта deferred. Статья будет полезна программистам, начинающим постигать асинхронное программирование, а также знакомым с ним, но не владеющим объектом deferred.
Окунуться в мир асинхронного программирования
Total votes 21: ↑17 and ↓4 +13
Comments 15

[UPD] Chain.js: связываем синхронные и асинхронные функции в цепи

Reading time 5 min
Views 8.8K
Website development *JavaScript *
Sandbox
Chain.js — маленькая библиотека, сделанная для создания цепочек из синхронных и асинхронных функций. Идея цепочек родилась после знакомства с Common JS Promises. Само определение «обещаний» говорит, что promise — это значение выполнения одной операции. Если вам захотелось что-то изобрести, придумать или создать, то вы просто обязаны попытаться связать эти операции в цепочки. Конечно, вы не обязаны, и это естественно, но для меня это стало основным мотивом. Перед этим я действительно столкнулся с некоторыми неудобствами связывания promise-операций, хотя ожидал что именно с этим они мне и помогут.
Читать дальше →
Total votes 23: ↑16 and ↓7 +9
Comments 9

Рекурсивное сохранение вложенностей с помощью $.Deferred

Reading time 12 min
Views 5.5K
JavaScript *jQuery *
Tutorial
Sandbox
image
Приветствую хабр, довелось мне недавно писать сервис опросов. В админке этого сервиса была форма с вопросами и вложенными в них примечаниями. И нужно было мне при сохранении вопроса, сохранять все открытые на редактирование вложенности, в чем мне безумно помог jQuery $.Deferred, об этом я и хочу рассказать вам в этой статье.

Допустим у нас есть такая структура вопросов и примечаний к ним, как указана на скриншоте справа, её мы и будем разбирать. Я не дизайнер, стилизировал как смог, чисто для этой статьи, так что извиняйте.

Пойдем по порядку.
Сначала объясню какие были условия.

Есть вопросы, внутри них могут быть примечания. При нажатии редактировать или сохранить — с сервера возвращается вёрстка вопроса/примечания и заменяется в шаблоне. Задача в том чтобы не потерять изменения примечаний при сохранении вопроса, если одновременно редактировались и вопрос и вложенное примечание.

Есть несколько вариантов решения этой проблемы, наверняка можно было отправлять всё разом на сервер а там уже разбирать, но это потребовало бы изменения структуры.
Мне понравился вариант с отложенным сохранением родительского вопроса, если имеются на сохранение некие дочерние элементы. Такое поведение бывает нужно в самых разных ситуациях, и даже в моей недолгой практике это потребовалось уже несколько раз.
Читать дальше →
Total votes 10: ↑9 and ↓1 +8
Comments 9

О применении $.Deferred в работе с асинхронными задачами

Reading time 15 min
Views 21K
JavaScript *jQuery *
Sandbox
Привет всем!

В данной статье я хотел бы поделиться с вами соображениями о том, как на практике можно использовать механизм работы с асинхронными процессами, предоставляемый библиотекой jQuery с версии 1.5 под названием deferred, «отложенный» (jQuery.Deferred), а также со связанными объектами и методами.

Разумеется, уже написан не один десяток статей на тему работы с парой deferred/promise. Своей же я задался целью предоставить такой набор знаний, который дал бы новичку, во-первых, возможность забыть о своих страхах перед непонятным и сложным и, во-вторых, сделать еще один шаг к написанию понятного и хорошо структурированного кода, работающего с асинхронными процессами. Я бы хотел сосредоточить свое и ваше внимание на проблемах, которые легко разрешаются ипользованием deferred, на предпосылках и типовых схемах использования этого объекта.
Читать дальше →
Total votes 30: ↑28 and ↓2 +26
Comments 6

Мой последний file uploader

Reading time 15 min
Views 44K
JavaScript *Programming *
Sandbox
image
Я — веб-разработчик с непрофильным образованием и ~10-летним стажем. Я делал для веба все, что только могло прийти в голову моим заказчикам и, иногда, начальству. Я люблю эту работу. Но все же есть несколько вещей, которые я делаю совсем не улыбаясь. Одна из них — это file uploader. From the very beginning — когда еще никому не приходило в голову делать его аяксовым — и до настоящего времени — когда он ресайзит картинки, загружает файлы в несколько потоков и многое-многое другое — он остается для меня одной из самых нелюбимых задач. Вроде как у меня получилось с этим справиться. Если интересно — добро пожаловать под кат.
Вас ждут немножко Coffeescript-а, совсем чуть-чуть жалоб на jQuery, краткое описание $.Deferred, один к месту и не к месту нечаянно примененный паттерн и отсылка к одной забавной и интересной книге.
Читать дальше →
Total votes 94: ↑72 and ↓22 +50
Comments 26

Variadic templates. Tuples, unpacking and more

Reading time 7 min
Views 78K
C++ *
В этом посте я поговорю о шаблонах с переменным числом параметров. В качестве примера будет приведена простейшая реализация класса tuple. Также я расскажу о распаковке tuple'а и подстановки, хранимых там значений в качестве аргументов функции. И напоследок приведу пример использования вышеописанных техник для реализации отложенного выполнения функции, которое может быть использовано, например, в качестве аналога finally блоков в других языках.
Читать дальше →
Total votes 53: ↑51 and ↓2 +49
Comments 7

JQuery Deferred — примеры использования

Reading time 5 min
Views 65K
Bankrot-pro corporate blog JavaScript *jQuery *
В этой статье я не буду говорить о том зачем в javascript нужны промисы и в частности JQuery.Deferred. Также не буду приводить справочную информацию, ее достаточно в интернете. Например тут или тут или вот тут.
Эта статья для тек кто уже немного знаком с объектом Deferred из библиотеки JQuery, но не имеет опыта написания сложных цепочек (очередей).

Подготовка

Все примеры кода, рассмотренные здесь, используют асинхронный метод $.ajax(), который возвращает так называемый jqXHR в котором реализованы промис-методы (done, fail, always, then). Нам нужны будут только они, поэтому будем считать что $.ajax возвращает промис (promise).
В некоторых примерах используются методы $.map() и $.each(), которые входят в состав библиотеки JQuery.

Последовательное выполнение

Простейшее использование промисов — это последовательное выполнение асинхронных операций. То есть следующая операция не начинается пока текущая не закончится.

$.ajax('http://echo.jsontest.com/id/1')
.then(function(result){
    console.log(JSON.stringify(result));
    return $.ajax('http://echo.jsontest.com/id/2')
}).then(function(result){
    console.log(JSON.stringify(result));
    return $.ajax('http://echo.jsontest.com/id/3')
}).then(function(result){
    console.log(JSON.stringify(result));
});

Живой пример тут.
Читать дальше →
Total votes 54: ↑45 and ↓9 +36
Comments 15
1