SlideShare a Scribd company logo
1 of 30
Download to read offline
Асинхронное
программирование

в C++
Пузыревский Иван,
старший разработчик
C++ Party, 27.03.2014
Что такое синхронность?
• Синхронное вычисление – блокирующее вызывающий
поток исполнения до момента завершения работы
вызываемого
• int main() { /*(1)*/ foo(42); /*(6)*/ } 

int foo(int x) {

/*(2)*/

int y = x * x;

int z = bar(y);

/*(5)*/

return z;

}

int bar(int y) {

/*(3)*/

int w = 42 + y;

/*(4)*/

return w;

}

Что такое асинхронность?
• Асинхронный ввод/вывод – форма ввода/вывода,
допускающая продолжение вычисления до окончания
передачи данных
• std::string blob(100);

int rv = read(fd, blob.data(), blob.size());
• “If successful, the number of bytes actually read is returned.
Upon reading end-of-file, zero is returned. Otherwise, a -1 is
returned and the global variable errno is set to indicate the
error. […] EAGAIN – The file was marked for non-blocking I/O,
and no data were ready to be read.”
• Можно обслуживать другие сокеты во время
недоступности; обрабатывать несколько запросов
“одновременно”
Что такое асинхронность?
• Асинхронные события – происходящие независимо от
основного потока исполнения
• RPC = Remote Procedure Call
– Можно делать полезную работу после отправки запроса
• AJAX = Asynchronous Javascript and XML
– Пользователь может взаимодействовать с
интерфейсом во время обработки формы/клика
Что такое асинхронность?
• Асинхронное вычисление – с разделенными точками
начала и завершения, причем точка завершения не
связана с основным потоком исполнения
• Два основных вопроса
– Как узнать о завершении вычисления?
– Как возвращать значение по завершению вычисления?
Почему асинхронность?
• Две наиболее распространенных реализации:
• вынесение “тяжелых” вызовов в отдельные потоки,
• использование реактивной модели (epoll/kqueue)
• Во всех случаях есть фазы ожидания событий
(доступность сокета на чтение/запись чтение)

и реакции на события (чтение ответа/формирование
запроса)
• Разница в том, кто планирует исполнение следующего
фрагмента кода (ОС в случае потоков, разработчик в
случае реактивной модели)
О реактивной модели
• Почему высоконагруженные системы пишут с
использованием реактивной модели?
– “Majority of the context-switching cost attributable to the
complexity of the scheduling decision by a modern SMP
CPU scheduler”

(Paul Turner, Google, at Linux Plumbers Conference 2013)
– Возможность кооперации внутри приложения
– Больший контроль над планированием
О реактивной модели
• Есть два похожих, но разных понятия –

конкурентность (concurrency) и параллелизм (parallelism)
• Конкурентность – композиция независимо исполняемых
вычислений
– как справляться с несколькими действиями
одновременно?
– относится к структуре программы
• Параллелизм – одновременное исполнение (возможно
связанных) вычислений
– как делать несколько действий одновременно?
– относится к исполнению программы
Выражение асинхронности
• Как узнать о завершении вычисления?
• Как возвращать значение по завершению вычисления?
• Pull: дескриптор и способ его инспекции

read(fd) = EAGAIN + epoll_ctl() + epoll_wait()
• Push: функция-обработчик (callback; проактивная)

// JS

$.ajax({ … success: function() { console.log(“Done!”); } })



// C++

typedef void (*uv_alloc_cb)(uv_handle_t* h, size_t hint, uv_buf_t* buf);

typedef void (*uv_read_cb)(uv_stream_t* s, ssize_t nread, const uv_buf_t* buf);

int uv_read_start(uv_stream_t*, uv_alloc_cb alloc_cb, uv_read_cb read_cb);
• Далее доклад будет о push-модели
Выражение асинхронности
• Основные проблемы
– плохое разделение зон ответственности
– плохие возможности по композиции
• Мысленный эксперимент
– читаем исходный запрос из сокета

(OnRequestReceived)
– шлем дополнительный запрос серверу

(QueryBackend + OnBackendResponse)
– формируем ответ

(OnRequestHandled)
– теперь добавим дисковое кеширование в эту цепочку…
Future/Promise
• Специальный контейнер, представляющий отложенное
значение
– Фьюча (future) – интерфейс чтения (отложенного)
значения
– Промис (promise) – интерфейс “возврата” значения
• Асинхронное вычисление знает промис, который она
обещает заполнить по окончании вычисления
• Пользователь значет фьючу, которая в каком-то будущем
будет заполнена
Future/Promise
• template <class T> class Future<T> {

bool IsSet() const;



const T& Get() const;

T* TryGet() const;



void Subscribe(std::function<void(T)> cb);



Future<R> Apply(

std::function<R(T)> f);

Future<R> Apply(

std::function<Future<R>(T)> f);

};
Future/Promise
• template <class T> class Promise<T> {

bool IsSet() const;



void Set(const T& value);

bool TrySet(const T& value);



Future<T> ToFuture() const;

};

• // Создает новый (пустой) промис

Promise<T> NewPromise();

// Создает новую фьючу с заданным значением

Future<T> NewFuture(const T& value);
Композиция Future
• template <class T> template <class R>

Future<R> Future<T>::Apply(

std::function<R(T)> f)

{

auto promise = NewPromise<T>();

this->Subscribe([promise] (T t) {

auto result = f(t);

promise.Set(result);

});

return promise.ToFuture();

}
Композиция Future
• template <class T> template <class R>

Future<R> Future<T>::Apply(

std::function<Future<R>(T)> f)

{

auto promise = NewPromise<R>();

this->Subscribe([promise] (T t) {

auto result = f(t);

result.Subscribe([promise] (R r) {

promise.Set(r);

});

});

return promise.ToFuture();

}
Композиция Future
Примеры Future
• Future<int> value = AsyncGetValue();

value.Subscribe([] (int v) {

std::cerr << “Value is: “ << v << std::endl;

});
• Future<int> anotherValue = value

.Apply([] (int v) { return 2 * v; });
• Future<int> yetAnotherValue = value

.Apply([] (int v) { return 2 * v; })

.Apply([] (int u) { return u + 1; })

.Apply([] (int w) { return w * w; });

Примеры Future
• // Вызывает cb когда вычисление закончится

void DoHeavyStuff(std::function<void()> cb);
• // Возвращает фьючу

Future<void> AsyncDoHeavyStuff() {

auto promise = NewPromise<void>();

DoHeavyStuff([promise] () {

promise.Set();

});

return promise.ToFuture();

}
О запуске вычислений
• До этого мы не касались вопросов, в каком потоке
запускаются вычисления и в где исполняются обработчики
• Удобно иметь интерфейс для запуска вычислений
• typedef Function<void()> Action;

struct Scheduler {

virtual void Schedule(Action cb) = 0;

};
• Возможные реализации:
– синхронный вызов
– отдельный поток с очередью
– поток с очередью с приоритетами
– пул потоков с общей очередью
О запуске вычислений
• Часто нужно исполнить действие в конкретном потоке
• Function<void()>

Function<void()>::Via(Scheduler* scheduler) {

return [=] () {

scheduler->Schedule(*this);

});

}
• // OnDone будет вызван в потоке вычисления

DoHeavyStuff().Subscribe(

Bind(&OnDone));

// OnDone будет вызван в специальном потоке

DoHeavyStuff().Subscribe(

Bind(&OnDone).Via(specificThreadScheduler));
О запуске вычислений
• Часто нужно делегировать вычисление в другой поток
• Function<Future<T>()>

Function<T>()>::AsyncVia(Scheduler* scheduler)

{

return [=] () {

auto promise = NewPromise<T>();

scheduler->Schedule([=] () {

promise.Set(this->Run());

});

return promise.ToFuture();

};

}
О запуске вычислений
• int GetNthPiDigit(int n);

Bind(&GetNthPiDigit)

// Function<int(int)>

.AsyncVia(workerPool)

// Function<Future<int>(int)>

.Run(100)

// Future<int>

.Subscribe(

Bind(&OnDone)

.Via(controlThread));
О запуске вычислений
int GetNthPiDigit(int n);

Bind(&GetNthPiDigit)

.AsyncVia(workerPool)

.Run(100)

.Subscribe(

Bind(&OnDone)

.Via(controlThread));
Пример
• Future<string> SendByNetwork();

string EncodeRequest(Request req);

Response DecodeResponse(string blob);



• Future<Response> AskByNetwork(Request req) {

auto blob = MakeFuture(EncodeRequest(req));



return blob

.Apply(&SendByNetwork)

.Apply(&DecodeResponse);

}
Пример
• Future<string> SendByNetwork();

string EncodeRequest(Request req);

Response DecodeResponse(string blob);

Scheduler* workerPool;

• Future<Response> AskByNetwork(Request req) {

auto blob =

Bind(&EncodeRequest).AsyncVia(workerPool).Run(req);

return blob

.Apply(&SendByNetwork)

.Apply(Bind(&DecodeResponse).AsyncVia(workerPool));

}
Пример
• Future<Request> GetRequest();

Future<Payload> QueryBackend(Request req);

Future<Response> HandlePayload(Payload pld);

Future<void> Reply(Request req, Response rsp);

• GetRequest()

.Subscribe([] (Request req) {

auto rsp = QueryBackend(req)

.Apply(&HandlePayload)

.Apply(Bind(&Reply, req));

}
Все равно не совсем удобно
• Удобная композиция, но еще не идеально
• Если проводить аналогию, то хочется исполнять
(псевдо)синхронный код в (псевдо)потоке
• Сопрограммы позволяют реализовать псевдопотоки в
пользовательском пространстве и сделать код
псевдосинхронным
• Хочется магию

T WaitFor(Future<T> future);
• auto req = WaitFor(GetRequest());

auto pld = WaitFor(QueryBackend(req));

auto rsp = WaitFor(HandlePayload(pld));

WaitFor(Reply(req, rsp));
• Об этом следующий доклад
старший разработчик
sandello@yandex-team.ru
Спасибо
Пузыревский Иван
Обработка ошибок
• template <class T> class ErrorOr<T> {

ErrorOr<T>(T value);

ErrorOr<T>(std::exception_ptr ex);



const T& GetOrThrow() const;

}
• Function<ErrorOr<T>()>

Function<T>()>::Guarded() {

try {

return ErrorOr(this->Run());

} catch (…) {

return ErrorOr(std::current_exception());

}

}

More Related Content

What's hot

разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2Eugeniy Tyumentcev
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияAlexey Paznikov
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Mikhail Kurnosov
 
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Mikhail Kurnosov
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...Alexey Paznikov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...Alexey Paznikov
 
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...Alexey Paznikov
 
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Mikhail Kurnosov
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...Alexey Paznikov
 
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...Alexey Paznikov
 
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Mikhail Kurnosov
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...Alexey Paznikov
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Alexey Paznikov
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 

What's hot (20)

разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
 
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
 
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
 
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
 
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 

Similar to Иван Пузыревский — Введение в асинхронное программирование

ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsAlexey Paznikov
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...OdessaFrontend
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerAnton Arhipov
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS Pavel Tsukanov
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x IntroductionFedor Vompe
 
Параллельные алгоритмы обработки данных
Параллельные алгоритмы обработки данныхПараллельные алгоритмы обработки данных
Параллельные алгоритмы обработки данныхSergey Vasilyev
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.Igor Shkulipa
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Platonov Sergey
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Alex Tutubalin
 
язык програмирования
язык програмированияязык програмирования
язык програмированияOlegmingalev1997
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive ExtensionsGetDev.NET
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыYandex
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)Alexander Gornik
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2etyumentcev
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программированияguestfc8ae0
 

Similar to Иван Пузыревский — Введение в асинхронное программирование (20)

ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 
Параллельные алгоритмы обработки данных
Параллельные алгоритмы обработки данныхПараллельные алгоритмы обработки данных
Параллельные алгоритмы обработки данных
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12
 
язык програмирования
язык програмированияязык програмирования
язык програмирования
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive Extensions
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммы
 
JavaDay'14
JavaDay'14JavaDay'14
JavaDay'14
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 

More from Yandex

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksYandex
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Yandex
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаYandex
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаYandex
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Yandex
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Yandex
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Yandex
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Yandex
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Yandex
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Yandex
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Yandex
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Yandex
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровYandex
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Yandex
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Yandex
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Yandex
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Yandex
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Yandex
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Yandex
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Yandex
 

More from Yandex (20)

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of Tanks
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
 

Иван Пузыревский — Введение в асинхронное программирование

  • 1.
  • 3. Что такое синхронность? • Синхронное вычисление – блокирующее вызывающий поток исполнения до момента завершения работы вызываемого • int main() { /*(1)*/ foo(42); /*(6)*/ } 
 int foo(int x) {
 /*(2)*/
 int y = x * x;
 int z = bar(y);
 /*(5)*/
 return z;
 }
 int bar(int y) {
 /*(3)*/
 int w = 42 + y;
 /*(4)*/
 return w;
 }

  • 4. Что такое асинхронность? • Асинхронный ввод/вывод – форма ввода/вывода, допускающая продолжение вычисления до окончания передачи данных • std::string blob(100);
 int rv = read(fd, blob.data(), blob.size()); • “If successful, the number of bytes actually read is returned. Upon reading end-of-file, zero is returned. Otherwise, a -1 is returned and the global variable errno is set to indicate the error. […] EAGAIN – The file was marked for non-blocking I/O, and no data were ready to be read.” • Можно обслуживать другие сокеты во время недоступности; обрабатывать несколько запросов “одновременно”
  • 5. Что такое асинхронность? • Асинхронные события – происходящие независимо от основного потока исполнения • RPC = Remote Procedure Call – Можно делать полезную работу после отправки запроса • AJAX = Asynchronous Javascript and XML – Пользователь может взаимодействовать с интерфейсом во время обработки формы/клика
  • 6. Что такое асинхронность? • Асинхронное вычисление – с разделенными точками начала и завершения, причем точка завершения не связана с основным потоком исполнения • Два основных вопроса – Как узнать о завершении вычисления? – Как возвращать значение по завершению вычисления?
  • 7. Почему асинхронность? • Две наиболее распространенных реализации: • вынесение “тяжелых” вызовов в отдельные потоки, • использование реактивной модели (epoll/kqueue) • Во всех случаях есть фазы ожидания событий (доступность сокета на чтение/запись чтение)
 и реакции на события (чтение ответа/формирование запроса) • Разница в том, кто планирует исполнение следующего фрагмента кода (ОС в случае потоков, разработчик в случае реактивной модели)
  • 8. О реактивной модели • Почему высоконагруженные системы пишут с использованием реактивной модели? – “Majority of the context-switching cost attributable to the complexity of the scheduling decision by a modern SMP CPU scheduler”
 (Paul Turner, Google, at Linux Plumbers Conference 2013) – Возможность кооперации внутри приложения – Больший контроль над планированием
  • 9. О реактивной модели • Есть два похожих, но разных понятия –
 конкурентность (concurrency) и параллелизм (parallelism) • Конкурентность – композиция независимо исполняемых вычислений – как справляться с несколькими действиями одновременно? – относится к структуре программы • Параллелизм – одновременное исполнение (возможно связанных) вычислений – как делать несколько действий одновременно? – относится к исполнению программы
  • 10. Выражение асинхронности • Как узнать о завершении вычисления? • Как возвращать значение по завершению вычисления? • Pull: дескриптор и способ его инспекции
 read(fd) = EAGAIN + epoll_ctl() + epoll_wait() • Push: функция-обработчик (callback; проактивная)
 // JS
 $.ajax({ … success: function() { console.log(“Done!”); } })
 
 // C++
 typedef void (*uv_alloc_cb)(uv_handle_t* h, size_t hint, uv_buf_t* buf);
 typedef void (*uv_read_cb)(uv_stream_t* s, ssize_t nread, const uv_buf_t* buf);
 int uv_read_start(uv_stream_t*, uv_alloc_cb alloc_cb, uv_read_cb read_cb); • Далее доклад будет о push-модели
  • 11. Выражение асинхронности • Основные проблемы – плохое разделение зон ответственности – плохие возможности по композиции • Мысленный эксперимент – читаем исходный запрос из сокета
 (OnRequestReceived) – шлем дополнительный запрос серверу
 (QueryBackend + OnBackendResponse) – формируем ответ
 (OnRequestHandled) – теперь добавим дисковое кеширование в эту цепочку…
  • 12. Future/Promise • Специальный контейнер, представляющий отложенное значение – Фьюча (future) – интерфейс чтения (отложенного) значения – Промис (promise) – интерфейс “возврата” значения • Асинхронное вычисление знает промис, который она обещает заполнить по окончании вычисления • Пользователь значет фьючу, которая в каком-то будущем будет заполнена
  • 13. Future/Promise • template <class T> class Future<T> {
 bool IsSet() const;
 
 const T& Get() const;
 T* TryGet() const;
 
 void Subscribe(std::function<void(T)> cb);
 
 Future<R> Apply(
 std::function<R(T)> f);
 Future<R> Apply(
 std::function<Future<R>(T)> f);
 };
  • 14. Future/Promise • template <class T> class Promise<T> {
 bool IsSet() const;
 
 void Set(const T& value);
 bool TrySet(const T& value);
 
 Future<T> ToFuture() const;
 };
 • // Создает новый (пустой) промис
 Promise<T> NewPromise();
 // Создает новую фьючу с заданным значением
 Future<T> NewFuture(const T& value);
  • 15. Композиция Future • template <class T> template <class R>
 Future<R> Future<T>::Apply(
 std::function<R(T)> f)
 {
 auto promise = NewPromise<T>();
 this->Subscribe([promise] (T t) {
 auto result = f(t);
 promise.Set(result);
 });
 return promise.ToFuture();
 }
  • 16. Композиция Future • template <class T> template <class R>
 Future<R> Future<T>::Apply(
 std::function<Future<R>(T)> f)
 {
 auto promise = NewPromise<R>();
 this->Subscribe([promise] (T t) {
 auto result = f(t);
 result.Subscribe([promise] (R r) {
 promise.Set(r);
 });
 });
 return promise.ToFuture();
 }
  • 18. Примеры Future • Future<int> value = AsyncGetValue();
 value.Subscribe([] (int v) {
 std::cerr << “Value is: “ << v << std::endl;
 }); • Future<int> anotherValue = value
 .Apply([] (int v) { return 2 * v; }); • Future<int> yetAnotherValue = value
 .Apply([] (int v) { return 2 * v; })
 .Apply([] (int u) { return u + 1; })
 .Apply([] (int w) { return w * w; });

  • 19. Примеры Future • // Вызывает cb когда вычисление закончится
 void DoHeavyStuff(std::function<void()> cb); • // Возвращает фьючу
 Future<void> AsyncDoHeavyStuff() {
 auto promise = NewPromise<void>();
 DoHeavyStuff([promise] () {
 promise.Set();
 });
 return promise.ToFuture();
 }
  • 20. О запуске вычислений • До этого мы не касались вопросов, в каком потоке запускаются вычисления и в где исполняются обработчики • Удобно иметь интерфейс для запуска вычислений • typedef Function<void()> Action;
 struct Scheduler {
 virtual void Schedule(Action cb) = 0;
 }; • Возможные реализации: – синхронный вызов – отдельный поток с очередью – поток с очередью с приоритетами – пул потоков с общей очередью
  • 21. О запуске вычислений • Часто нужно исполнить действие в конкретном потоке • Function<void()>
 Function<void()>::Via(Scheduler* scheduler) {
 return [=] () {
 scheduler->Schedule(*this);
 });
 } • // OnDone будет вызван в потоке вычисления
 DoHeavyStuff().Subscribe(
 Bind(&OnDone));
 // OnDone будет вызван в специальном потоке
 DoHeavyStuff().Subscribe(
 Bind(&OnDone).Via(specificThreadScheduler));
  • 22. О запуске вычислений • Часто нужно делегировать вычисление в другой поток • Function<Future<T>()>
 Function<T>()>::AsyncVia(Scheduler* scheduler)
 {
 return [=] () {
 auto promise = NewPromise<T>();
 scheduler->Schedule([=] () {
 promise.Set(this->Run());
 });
 return promise.ToFuture();
 };
 }
  • 23. О запуске вычислений • int GetNthPiDigit(int n);
 Bind(&GetNthPiDigit)
 // Function<int(int)>
 .AsyncVia(workerPool)
 // Function<Future<int>(int)>
 .Run(100)
 // Future<int>
 .Subscribe(
 Bind(&OnDone)
 .Via(controlThread));
  • 24. О запуске вычислений int GetNthPiDigit(int n);
 Bind(&GetNthPiDigit)
 .AsyncVia(workerPool)
 .Run(100)
 .Subscribe(
 Bind(&OnDone)
 .Via(controlThread));
  • 25. Пример • Future<string> SendByNetwork();
 string EncodeRequest(Request req);
 Response DecodeResponse(string blob);
 
 • Future<Response> AskByNetwork(Request req) {
 auto blob = MakeFuture(EncodeRequest(req));
 
 return blob
 .Apply(&SendByNetwork)
 .Apply(&DecodeResponse);
 }
  • 26. Пример • Future<string> SendByNetwork();
 string EncodeRequest(Request req);
 Response DecodeResponse(string blob);
 Scheduler* workerPool;
 • Future<Response> AskByNetwork(Request req) {
 auto blob =
 Bind(&EncodeRequest).AsyncVia(workerPool).Run(req);
 return blob
 .Apply(&SendByNetwork)
 .Apply(Bind(&DecodeResponse).AsyncVia(workerPool));
 }
  • 27. Пример • Future<Request> GetRequest();
 Future<Payload> QueryBackend(Request req);
 Future<Response> HandlePayload(Payload pld);
 Future<void> Reply(Request req, Response rsp);
 • GetRequest()
 .Subscribe([] (Request req) {
 auto rsp = QueryBackend(req)
 .Apply(&HandlePayload)
 .Apply(Bind(&Reply, req));
 }
  • 28. Все равно не совсем удобно • Удобная композиция, но еще не идеально • Если проводить аналогию, то хочется исполнять (псевдо)синхронный код в (псевдо)потоке • Сопрограммы позволяют реализовать псевдопотоки в пользовательском пространстве и сделать код псевдосинхронным • Хочется магию
 T WaitFor(Future<T> future); • auto req = WaitFor(GetRequest());
 auto pld = WaitFor(QueryBackend(req));
 auto rsp = WaitFor(HandlePayload(pld));
 WaitFor(Reply(req, rsp)); • Об этом следующий доклад
  • 30. Обработка ошибок • template <class T> class ErrorOr<T> {
 ErrorOr<T>(T value);
 ErrorOr<T>(std::exception_ptr ex);
 
 const T& GetOrThrow() const;
 } • Function<ErrorOr<T>()>
 Function<T>()>::Guarded() {
 try {
 return ErrorOr(this->Run());
 } catch (…) {
 return ErrorOr(std::current_exception());
 }
 }