SlideShare a Scribd company logo
1 of 37
Download to read offline
Многопоточность 
в браузере. 
Модель акторов 
Константин Крамлих
Инициализируем плеер 
void Player::Init() { 
OpenFile(); 
InitializeDecoder(); 
InitializeRenderer(); 
StartDecodeLoop(); 
StartDisplayLoop(); 
}
Читаем и показываем кадры 
// Producer thread 
void Player::DecodeLoop() { 
... 
while (!end) { 
... 
decoder->ReadFrame(&frame); 
queue->Push(frame); 
... 
} 
} 
// Consumer thread 
void Player::DisplayLoop() { 
while (!end) { 
... 
queue->Pop(&frame); 
if (!frame) 
continue; 
end = frame->IsLastFrame(); 
ShowFrame(frame); 
... 
} 
}
Почему так нельзя 
▌ Греем воздух 
▌ Ненужная очередь 
▌ Мьютексы/Условные переменные для синхронизации
8
9
Требования к браузеру 
▌ Отзывчивый UI 
▌ Скорость работы 
▌ Выполнение большого количества задач одновременно 
10
Основные потоки в браузере 
▌ UI thread 
▌ IO thread 
▌ File thread 
▌ DB thread 
▌ SafeBrowsing thread 
▌ History thread 
11
12 
Main thread 
Actor Actor 
Actor Actor
Важные классы в Chromium 
▌ Callback & Closure 
▌ TaskRunner & SequencedTaskRunner & 
SingleThreadTaskRunner 
▌ MessageLoop & MessageLoopProxy 
▌ Thread & PlatformThread 
▌ BrowserThread 
13
Callback & Closure 
void DoSomeJob(base::Callback<void (bool)> result_cb); 
void OnJobCompleted(bool success); 
void Foo() { 
DoSomeJob(base::Bind(&OnJobCompleted)); 
} 
void OnJobCompletedExtraData(const std::string& extra_data, bool success); 
void Bar() { 
DoSomeJob(base::Bind(&OnJobCompletedWithExtraData, "Called from Bar")); 
} 
14
Почему не std::function 
▌ std::function еще не было 
▌ Функционал std::function шире 
▌ std::function делает копию внутреннего состояния при копировании 
▌ Неявные касты вида std::function<int(int)> -> std::function<void(int)>
MessageLoop & MessageLoopProxy 
void DoSomeJob(base::Callback<void (bool)> result_cb); 
void OnJobCompleted(bool success); 
void Bar() { 
MessageLoopProxy::current()->PostTask( 
FROM_HERE, 
base::Bind(&DoSomeJob(base::Bind(&OnJobCompleted)))); 
} 
16
Thread & PlatformThread 
void Bar(); 
void Foo() { 
base::Thread thread("MyWorkerThread"); 
thread.message_loop_proxy()->PostTask( 
FROM_HERE, 
base::Bind(&Bar)); 
}
BrowserThread 
void Foo(int); 
void Bar() { 
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 
base::Bind(&Foo, 42)); 
}
base::Bind для методов классов 
class SomeClass : public base::RefCountedThreadSafe<SomeClass> { 
public: 
void A() {}; 
void B() { 
base::Callback<void()> cb = base::Bind(&Foo::A, this); 
cb.Run(); 
} 
};
base::Bind для методов классов 
class SomeClass { 
public: 
void A() {}; 
void B() { 
base::Callback<void()> cb = base::Bind(&Foo::A, base::Unretained(this)); 
cb.Run(); 
} 
};
Удаление на нужном потоке 
class SomeClass : public base::RefCountedThreadSafe<SomeClass, 
BrowserThread::DeleteOnIOThread> { 
... 
}
Обнаружение опасности 
void SafeBrowsingResourceThrottle::OnCheckBrowseUrlResult( 
const GURL& url, 
SBThreatType threat_type, 
const std::string& metadata) { 
... 
SafeBrowsingUIManager::UnsafeResource resource; 
resource.url = url; 
... 
resource.callback = base::Bind( 
&SafeBrowsingResourceThrottle::OnBlockingPageComplete, AsWeakPtr()); 
content::BrowserThread::PostTask( 
content::BrowserThread::UI, 
FROM_HERE, 
base::Bind(&SafeBrowsingResourceThrottle::StartDisplayingBlockingPage, 
AsWeakPtr(), ui_manager_, resource)); 
}
Блокировка страницы 
void SafeBrowsingUIManager::DisplayBlockingPage( 
const UnsafeResource& resource) { 
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 
... 
if (IsWhitelisted(resource)) { 
if (!resource.callback.is_null()) { 
BrowserThread::PostTask( 
BrowserThread::IO, FROM_HERE, base::Bind(resource.callback, true)); 
} 
return; 
} 
... 
SafeBrowsingBlockingPage::ShowBlockingPage(this, resource); 
}
Завершение блокировки 
void SafeBrowsingUIManager::OnBlockingPageDone( 
const std::vector<UnsafeResource>& resources, 
bool proceed) { 
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 
for (std::vector<UnsafeResource>::const_iterator iter = resources.begin(); 
iter != resources.end(); ++iter) { 
const UnsafeResource& resource = *iter; 
if (!resource.callback.is_null()) 
resource.callback.Run(proceed); 
if (proceed) { 
BrowserThread::PostTask( 
BrowserThread::UI, 
FROM_HERE, 
base::Bind(&SafeBrowsingUIManager::UpdateWhitelist, this, resource)); 
} 
} 
}
Выводы 
▌ Данные привязаны к конкретным потокам 
▌ Нет нужды в мьютексах 
▌ Проверяем, что работаем на нужном потоке
Привязка к нужному потоку 
#define BIND_TO_RENDER_LOOP(function)  
(DCHECK(main_task_runner_->BelongsToCurrentThread()),  
BindToCurrentLoop(base::Bind(function, AsWeakPtr()))) 
void WebMediaPlayerImpl::StartPipeline() { 
DCHECK(main_task_runner_->BelongsToCurrentThread()); 
... 
pipeline_.Start( 
demuxer_.get(), 
CreateRenderer(), 
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), 
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), 
BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnPipelineSeeked, false), 
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineMetadata), 
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingStateChanged), 
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChanged), 
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnAddTextTrack)); 
} 
26
Неявное использование на другом потоке 
void Pipeline::BufferingStateChanged(BufferingState new_buffering_state) { 
DVLOG(1) << __FUNCTION__ << "(" << new_buffering_state << ") ”; 
DCHECK(task_runner_->BelongsToCurrentThread()); 
buffering_state_cb_.Run(new_buffering_state); 
}
Скрытие потоков исполнения 
virtual void QueryForMatches( 
const std::set<SourceFrameRef>& candidates, 
const MatchesCallback& results_callback) OVERRIDE { 
BrowserThread::PostTask( 
BrowserThread::UI, 
FROM_HERE, 
base::Bind(&MuteDestination::QueryForMatchesOnUIThread, 
this, 
candidates, 
media::BindToCurrentLoop(results_callback))); 
} 
void QueryForMatchesOnUIThread(const std::set<SourceFrameRef>& candidates, 
const MatchesCallback& results_callback) { 
... 
results_callback.Run(matches); 
}
Выводы 
▌ Не нужно думать о том, на каком потоке нужно дергать 
коллбеки 
▌ Скрываем информацию об исполняющем потоке
Инициализируем плеер 
void Player::Init() { 
OpenFile(); 
InitializeDecoder(); 
InitializeRenderer(); 
StartDecodeLoop(); 
StartDisplayLoop(); 
} 
30
Читаем и показываем кадры 
// Producer thread 
void Player::DecodeLoop() { 
... 
while (!end) { 
... 
decoder->ReadFrame(&frame); 
queue->Push(frame); 
... 
} 
} 
// Consumer thread 
void Player::DisplayLoop() { 
while (!end) { 
... 
queue->Pop(&frame); 
if (!frame) 
continue; 
end = frame->IsLastFrame(); 
ShowFrame(frame); 
... 
} 
}
Инициализируем плеер 
void Player::Init() { 
OpenFile(); 
base::Callback<void(Frame)> show_frame_cb = Bind(&ShowFrame, this); 
InitializeDecoder(BindToCurrentLoop(show_frame_cb)); 
InitializeRenderer(); 
StartDecodeLoop(); 
}
Читаем и отдаем кадры 
// Producer thread 
void Decoder::DecodeLoop() { 
... 
while (!end) { 
... 
decoder->ReadFrame(&frame); 
frame_ready_cb.Run(frame); 
... 
} 
}
class Account { 
double balance; 
int id; 
void withdraw(double amount) { 
balance -= amount; 
} 
void deposit(double amount) { 
balance += amount; 
} 
void transfer(Account from, Account to, double amount) { 
sync(from); 
sync(to); 
from.withdraw(amount); 
to.deposit(amount); 
release(to); 
release(from); 
} 
} 
Избегаем dedlock-и
Плюсы 
▌ Данные привязаны к конкретным потокам, не требуются 
примитивы синхронизации 
▌ Можно скрыть знание того, на каком потоке будет 
выполняться задача, а также поток выполнения коллбека 
▌ Проверяем поток, на котором происходит выполнение
Минусы 
▌ Код должен быть асинхронным 
▌ Теряем возможность использования исключений 
▌ В некоторых случаях использование мьютексов может быть 
быстрее 
36
Полезные ссылки 
▌ http://www.chromium.org/developers/coding-style/important-abstractions- 
and-data-structures 
▌ http://www.chromium.org/developers/design-documents/ 
threading 
▌ https://en.wikipedia.org/wiki/Actor_model 
37
Спасибо за внимание! 
38

More Related Content

What's hot

Konstantin Krivlenia - "Continuous integration for frontend"
Konstantin Krivlenia - "Continuous integration for frontend"Konstantin Krivlenia - "Continuous integration for frontend"
Konstantin Krivlenia - "Continuous integration for frontend"IT Event
 
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС2ГИС Технологии
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutinescorehard_by
 
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Yandex
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь ЧертенковImprove Group
 
МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016Anastasia Goryacheva
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node jsAlex Tumanoff
 
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работыPaul Stashevsky
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Mikhail Shcherbakov
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищиCUSTIS
 
TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.
TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.
TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.TKConf
 
Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"Fwdays
 
Basis.js – «под капотом»
Basis.js – «под капотом»Basis.js – «под капотом»
Basis.js – «под капотом»Roman Dvornov
 
Александр Тармолов "БЭМ и JavaScript: Тестирование"
Александр Тармолов "БЭМ и JavaScript: Тестирование"Александр Тармолов "БЭМ и JavaScript: Тестирование"
Александр Тармолов "БЭМ и JavaScript: Тестирование"Yandex
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest
 
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)Ontico
 

What's hot (20)

Konstantin Krivlenia - "Continuous integration for frontend"
Konstantin Krivlenia - "Continuous integration for frontend"Konstantin Krivlenia - "Continuous integration for frontend"
Konstantin Krivlenia - "Continuous integration for frontend"
 
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutines
 
JSSDK: Начало
JSSDK: НачалоJSSDK: Начало
JSSDK: Начало
 
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
 
Суперсилы Chrome developer tools
Суперсилы Chrome developer toolsСуперсилы Chrome developer tools
Суперсилы Chrome developer tools
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
 
МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
 
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работы
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищи
 
TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.
TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.
TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.
 
Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"
 
C++ exceptions
C++ exceptionsC++ exceptions
C++ exceptions
 
Basis.js – «под капотом»
Basis.js – «под капотом»Basis.js – «под капотом»
Basis.js – «под капотом»
 
Александр Тармолов "БЭМ и JavaScript: Тестирование"
Александр Тармолов "БЭМ и JavaScript: Тестирование"Александр Тармолов "БЭМ и JavaScript: Тестирование"
Александр Тармолов "БЭМ и JavaScript: Тестирование"
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
 
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
 

Viewers also liked

Tools, Testing and new New Team Members. The Story of Post 1.0. Orta therox
 Tools, Testing and new New Team Members. The Story of Post 1.0. Orta therox Tools, Testing and new New Team Members. The Story of Post 1.0. Orta therox
Tools, Testing and new New Team Members. The Story of Post 1.0. Orta theroxYandex
 
Иван Калинин - Как правильно выбрать язык программирования
Иван Калинин - Как правильно выбрать язык программированияИван Калинин - Как правильно выбрать язык программирования
Иван Калинин - Как правильно выбрать язык программированияYandex
 
Форум на полном БЭМ-стеке — Николай Ильченко, Яндекс
Форум на полном БЭМ-стеке — Николай Ильченко, ЯндексФорум на полном БЭМ-стеке — Николай Ильченко, Яндекс
Форум на полном БЭМ-стеке — Николай Ильченко, ЯндексYandex
 
Правильная организация клиент-карточного взаимодействия — Антон Корзунов
Правильная организация клиент-карточного взаимодействия — Антон КорзуновПравильная организация клиент-карточного взаимодействия — Антон Корзунов
Правильная организация клиент-карточного взаимодействия — Антон КорзуновYandex
 
Александр Шень — Неразрешимые задачи и нижние оценки
Александр Шень — Неразрешимые задачи и нижние оценкиАлександр Шень — Неразрешимые задачи и нижние оценки
Александр Шень — Неразрешимые задачи и нижние оценкиYandex
 
CSP: как защитить своих пользователей — Алексей Андросов
CSP: как защитить своих пользователей — Алексей АндросовCSP: как защитить своих пользователей — Алексей Андросов
CSP: как защитить своих пользователей — Алексей АндросовYandex
 
BEM IDE — прототип редактора БЭМ-проектов — Саша Белянский, Яндекс
BEM IDE — прототип редактора БЭМ-проектов — Саша Белянский, ЯндексBEM IDE — прототип редактора БЭМ-проектов — Саша Белянский, Яндекс
BEM IDE — прототип редактора БЭМ-проектов — Саша Белянский, ЯндексYandex
 
История про OpenSource в Яндексе
История про OpenSource в ЯндексеИстория про OpenSource в Яндексе
История про OpenSource в ЯндексеYandex
 
Куликовский Дмитрий - Работа системного администратора сегодня
 Куликовский Дмитрий - Работа системного администратора сегодня   Куликовский Дмитрий - Работа системного администратора сегодня
Куликовский Дмитрий - Работа системного администратора сегодня Yandex
 
Андрей Устюжанин - Технологии обработки данных из Большого адронного коллайдера
Андрей Устюжанин - Технологии обработки данных из Большого адронного коллайдераАндрей Устюжанин - Технологии обработки данных из Большого адронного коллайдера
Андрей Устюжанин - Технологии обработки данных из Большого адронного коллайдераYandex
 
Scott Meyers — Why C++ Sails When the Vasa Sank
Scott Meyers — Why C++ Sails When the Vasa SankScott Meyers — Why C++ Sails When the Vasa Sank
Scott Meyers — Why C++ Sails When the Vasa SankYandex
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовYandex
 
Роман Нестер — транзакционный-предиктивный_таргетинг_в_e-commerce
Роман Нестер — транзакционный-предиктивный_таргетинг_в_e-commerceРоман Нестер — транзакционный-предиктивный_таргетинг_в_e-commerce
Роман Нестер — транзакционный-предиктивный_таргетинг_в_e-commerceYandex
 
Инна Слизовская - Тест-менеджмент: статистика, документация и планы
Инна Слизовская - Тест-менеджмент: статистика, документация и планыИнна Слизовская - Тест-менеджмент: статистика, документация и планы
Инна Слизовская - Тест-менеджмент: статистика, документация и планыYandex
 
Валерий Дьяченко — Рекомендательные системы Ozon
Валерий Дьяченко — Рекомендательные системы OzonВалерий Дьяченко — Рекомендательные системы Ozon
Валерий Дьяченко — Рекомендательные системы OzonYandex
 
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Yandex
 
Андрей Куликов, Использование SDK Яндекс.Диска при разработке мобильных прило...
Андрей Куликов, Использование SDK Яндекс.Диска при разработке мобильных прило...Андрей Куликов, Использование SDK Яндекс.Диска при разработке мобильных прило...
Андрей Куликов, Использование SDK Яндекс.Диска при разработке мобильных прило...Yandex
 

Viewers also liked (17)

Tools, Testing and new New Team Members. The Story of Post 1.0. Orta therox
 Tools, Testing and new New Team Members. The Story of Post 1.0. Orta therox Tools, Testing and new New Team Members. The Story of Post 1.0. Orta therox
Tools, Testing and new New Team Members. The Story of Post 1.0. Orta therox
 
Иван Калинин - Как правильно выбрать язык программирования
Иван Калинин - Как правильно выбрать язык программированияИван Калинин - Как правильно выбрать язык программирования
Иван Калинин - Как правильно выбрать язык программирования
 
Форум на полном БЭМ-стеке — Николай Ильченко, Яндекс
Форум на полном БЭМ-стеке — Николай Ильченко, ЯндексФорум на полном БЭМ-стеке — Николай Ильченко, Яндекс
Форум на полном БЭМ-стеке — Николай Ильченко, Яндекс
 
Правильная организация клиент-карточного взаимодействия — Антон Корзунов
Правильная организация клиент-карточного взаимодействия — Антон КорзуновПравильная организация клиент-карточного взаимодействия — Антон Корзунов
Правильная организация клиент-карточного взаимодействия — Антон Корзунов
 
Александр Шень — Неразрешимые задачи и нижние оценки
Александр Шень — Неразрешимые задачи и нижние оценкиАлександр Шень — Неразрешимые задачи и нижние оценки
Александр Шень — Неразрешимые задачи и нижние оценки
 
CSP: как защитить своих пользователей — Алексей Андросов
CSP: как защитить своих пользователей — Алексей АндросовCSP: как защитить своих пользователей — Алексей Андросов
CSP: как защитить своих пользователей — Алексей Андросов
 
BEM IDE — прототип редактора БЭМ-проектов — Саша Белянский, Яндекс
BEM IDE — прототип редактора БЭМ-проектов — Саша Белянский, ЯндексBEM IDE — прототип редактора БЭМ-проектов — Саша Белянский, Яндекс
BEM IDE — прототип редактора БЭМ-проектов — Саша Белянский, Яндекс
 
История про OpenSource в Яндексе
История про OpenSource в ЯндексеИстория про OpenSource в Яндексе
История про OpenSource в Яндексе
 
Куликовский Дмитрий - Работа системного администратора сегодня
 Куликовский Дмитрий - Работа системного администратора сегодня   Куликовский Дмитрий - Работа системного администратора сегодня
Куликовский Дмитрий - Работа системного администратора сегодня
 
Андрей Устюжанин - Технологии обработки данных из Большого адронного коллайдера
Андрей Устюжанин - Технологии обработки данных из Большого адронного коллайдераАндрей Устюжанин - Технологии обработки данных из Большого адронного коллайдера
Андрей Устюжанин - Технологии обработки данных из Большого адронного коллайдера
 
Scott Meyers — Why C++ Sails When the Vasa Sank
Scott Meyers — Why C++ Sails When the Vasa SankScott Meyers — Why C++ Sails When the Vasa Sank
Scott Meyers — Why C++ Sails When the Vasa Sank
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
 
Роман Нестер — транзакционный-предиктивный_таргетинг_в_e-commerce
Роман Нестер — транзакционный-предиктивный_таргетинг_в_e-commerceРоман Нестер — транзакционный-предиктивный_таргетинг_в_e-commerce
Роман Нестер — транзакционный-предиктивный_таргетинг_в_e-commerce
 
Инна Слизовская - Тест-менеджмент: статистика, документация и планы
Инна Слизовская - Тест-менеджмент: статистика, документация и планыИнна Слизовская - Тест-менеджмент: статистика, документация и планы
Инна Слизовская - Тест-менеджмент: статистика, документация и планы
 
Валерий Дьяченко — Рекомендательные системы Ozon
Валерий Дьяченко — Рекомендательные системы OzonВалерий Дьяченко — Рекомендательные системы Ozon
Валерий Дьяченко — Рекомендательные системы Ozon
 
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
 
Андрей Куликов, Использование SDK Яндекс.Диска при разработке мобильных прило...
Андрей Куликов, Использование SDK Яндекс.Диска при разработке мобильных прило...Андрей Куликов, Использование SDK Яндекс.Диска при разработке мобильных прило...
Андрей Куликов, Использование SDK Яндекс.Диска при разработке мобильных прило...
 

Similar to Многопоточность в браузере. Модель акторов — Константин Крамлих

Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
 
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
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Sigma Software
 
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETDev2Dev
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Oleksii Okhrymenko
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
Транзакционный фреймворк для сингловых игр и игр с асинхронным мультиплеером ...
Транзакционный фреймворк для сингловых игр и игр с асинхронным мультиплеером ...Транзакционный фреймворк для сингловых игр и игр с асинхронным мультиплеером ...
Транзакционный фреймворк для сингловых игр и игр с асинхронным мультиплеером ...DevGAMM Conference
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)AvitoTech
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Vladimir Kochetkov
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийAndrey Akinshin
 
Mobile Fest#spb 2012
Mobile Fest#spb 2012Mobile Fest#spb 2012
Mobile Fest#spb 2012dmalykhanov
 
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
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...Alexey Paznikov
 

Similar to Многопоточность в браузере. Модель акторов — Константин Крамлих (20)

Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
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
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
 
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Транзакционный фреймворк для сингловых игр и игр с асинхронным мультиплеером ...
Транзакционный фреймворк для сингловых игр и игр с асинхронным мультиплеером ...Транзакционный фреймворк для сингловых игр и игр с асинхронным мультиплеером ...
Транзакционный фреймворк для сингловых игр и игр с асинхронным мультиплеером ...
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
 
Mobile Fest#spb 2012
Mobile Fest#spb 2012Mobile Fest#spb 2012
Mobile Fest#spb 2012
 
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
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
 

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.
  • 2. Многопоточность в браузере. Модель акторов Константин Крамлих
  • 3.
  • 4. Инициализируем плеер void Player::Init() { OpenFile(); InitializeDecoder(); InitializeRenderer(); StartDecodeLoop(); StartDisplayLoop(); }
  • 5. Читаем и показываем кадры // Producer thread void Player::DecodeLoop() { ... while (!end) { ... decoder->ReadFrame(&frame); queue->Push(frame); ... } } // Consumer thread void Player::DisplayLoop() { while (!end) { ... queue->Pop(&frame); if (!frame) continue; end = frame->IsLastFrame(); ShowFrame(frame); ... } }
  • 6. Почему так нельзя ▌ Греем воздух ▌ Ненужная очередь ▌ Мьютексы/Условные переменные для синхронизации
  • 7. 8
  • 8. 9
  • 9. Требования к браузеру ▌ Отзывчивый UI ▌ Скорость работы ▌ Выполнение большого количества задач одновременно 10
  • 10. Основные потоки в браузере ▌ UI thread ▌ IO thread ▌ File thread ▌ DB thread ▌ SafeBrowsing thread ▌ History thread 11
  • 11. 12 Main thread Actor Actor Actor Actor
  • 12. Важные классы в Chromium ▌ Callback & Closure ▌ TaskRunner & SequencedTaskRunner & SingleThreadTaskRunner ▌ MessageLoop & MessageLoopProxy ▌ Thread & PlatformThread ▌ BrowserThread 13
  • 13. Callback & Closure void DoSomeJob(base::Callback<void (bool)> result_cb); void OnJobCompleted(bool success); void Foo() { DoSomeJob(base::Bind(&OnJobCompleted)); } void OnJobCompletedExtraData(const std::string& extra_data, bool success); void Bar() { DoSomeJob(base::Bind(&OnJobCompletedWithExtraData, "Called from Bar")); } 14
  • 14. Почему не std::function ▌ std::function еще не было ▌ Функционал std::function шире ▌ std::function делает копию внутреннего состояния при копировании ▌ Неявные касты вида std::function<int(int)> -> std::function<void(int)>
  • 15. MessageLoop & MessageLoopProxy void DoSomeJob(base::Callback<void (bool)> result_cb); void OnJobCompleted(bool success); void Bar() { MessageLoopProxy::current()->PostTask( FROM_HERE, base::Bind(&DoSomeJob(base::Bind(&OnJobCompleted)))); } 16
  • 16. Thread & PlatformThread void Bar(); void Foo() { base::Thread thread("MyWorkerThread"); thread.message_loop_proxy()->PostTask( FROM_HERE, base::Bind(&Bar)); }
  • 17. BrowserThread void Foo(int); void Bar() { BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(&Foo, 42)); }
  • 18. base::Bind для методов классов class SomeClass : public base::RefCountedThreadSafe<SomeClass> { public: void A() {}; void B() { base::Callback<void()> cb = base::Bind(&Foo::A, this); cb.Run(); } };
  • 19. base::Bind для методов классов class SomeClass { public: void A() {}; void B() { base::Callback<void()> cb = base::Bind(&Foo::A, base::Unretained(this)); cb.Run(); } };
  • 20. Удаление на нужном потоке class SomeClass : public base::RefCountedThreadSafe<SomeClass, BrowserThread::DeleteOnIOThread> { ... }
  • 21. Обнаружение опасности void SafeBrowsingResourceThrottle::OnCheckBrowseUrlResult( const GURL& url, SBThreatType threat_type, const std::string& metadata) { ... SafeBrowsingUIManager::UnsafeResource resource; resource.url = url; ... resource.callback = base::Bind( &SafeBrowsingResourceThrottle::OnBlockingPageComplete, AsWeakPtr()); content::BrowserThread::PostTask( content::BrowserThread::UI, FROM_HERE, base::Bind(&SafeBrowsingResourceThrottle::StartDisplayingBlockingPage, AsWeakPtr(), ui_manager_, resource)); }
  • 22. Блокировка страницы void SafeBrowsingUIManager::DisplayBlockingPage( const UnsafeResource& resource) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); ... if (IsWhitelisted(resource)) { if (!resource.callback.is_null()) { BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, base::Bind(resource.callback, true)); } return; } ... SafeBrowsingBlockingPage::ShowBlockingPage(this, resource); }
  • 23. Завершение блокировки void SafeBrowsingUIManager::OnBlockingPageDone( const std::vector<UnsafeResource>& resources, bool proceed) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); for (std::vector<UnsafeResource>::const_iterator iter = resources.begin(); iter != resources.end(); ++iter) { const UnsafeResource& resource = *iter; if (!resource.callback.is_null()) resource.callback.Run(proceed); if (proceed) { BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(&SafeBrowsingUIManager::UpdateWhitelist, this, resource)); } } }
  • 24. Выводы ▌ Данные привязаны к конкретным потокам ▌ Нет нужды в мьютексах ▌ Проверяем, что работаем на нужном потоке
  • 25. Привязка к нужному потоку #define BIND_TO_RENDER_LOOP(function) (DCHECK(main_task_runner_->BelongsToCurrentThread()), BindToCurrentLoop(base::Bind(function, AsWeakPtr()))) void WebMediaPlayerImpl::StartPipeline() { DCHECK(main_task_runner_->BelongsToCurrentThread()); ... pipeline_.Start( demuxer_.get(), CreateRenderer(), BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnPipelineSeeked, false), BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineMetadata), BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingStateChanged), BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChanged), BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnAddTextTrack)); } 26
  • 26. Неявное использование на другом потоке void Pipeline::BufferingStateChanged(BufferingState new_buffering_state) { DVLOG(1) << __FUNCTION__ << "(" << new_buffering_state << ") ”; DCHECK(task_runner_->BelongsToCurrentThread()); buffering_state_cb_.Run(new_buffering_state); }
  • 27. Скрытие потоков исполнения virtual void QueryForMatches( const std::set<SourceFrameRef>& candidates, const MatchesCallback& results_callback) OVERRIDE { BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(&MuteDestination::QueryForMatchesOnUIThread, this, candidates, media::BindToCurrentLoop(results_callback))); } void QueryForMatchesOnUIThread(const std::set<SourceFrameRef>& candidates, const MatchesCallback& results_callback) { ... results_callback.Run(matches); }
  • 28. Выводы ▌ Не нужно думать о том, на каком потоке нужно дергать коллбеки ▌ Скрываем информацию об исполняющем потоке
  • 29. Инициализируем плеер void Player::Init() { OpenFile(); InitializeDecoder(); InitializeRenderer(); StartDecodeLoop(); StartDisplayLoop(); } 30
  • 30. Читаем и показываем кадры // Producer thread void Player::DecodeLoop() { ... while (!end) { ... decoder->ReadFrame(&frame); queue->Push(frame); ... } } // Consumer thread void Player::DisplayLoop() { while (!end) { ... queue->Pop(&frame); if (!frame) continue; end = frame->IsLastFrame(); ShowFrame(frame); ... } }
  • 31. Инициализируем плеер void Player::Init() { OpenFile(); base::Callback<void(Frame)> show_frame_cb = Bind(&ShowFrame, this); InitializeDecoder(BindToCurrentLoop(show_frame_cb)); InitializeRenderer(); StartDecodeLoop(); }
  • 32. Читаем и отдаем кадры // Producer thread void Decoder::DecodeLoop() { ... while (!end) { ... decoder->ReadFrame(&frame); frame_ready_cb.Run(frame); ... } }
  • 33. class Account { double balance; int id; void withdraw(double amount) { balance -= amount; } void deposit(double amount) { balance += amount; } void transfer(Account from, Account to, double amount) { sync(from); sync(to); from.withdraw(amount); to.deposit(amount); release(to); release(from); } } Избегаем dedlock-и
  • 34. Плюсы ▌ Данные привязаны к конкретным потокам, не требуются примитивы синхронизации ▌ Можно скрыть знание того, на каком потоке будет выполняться задача, а также поток выполнения коллбека ▌ Проверяем поток, на котором происходит выполнение
  • 35. Минусы ▌ Код должен быть асинхронным ▌ Теряем возможность использования исключений ▌ В некоторых случаях использование мьютексов может быть быстрее 36
  • 36. Полезные ссылки ▌ http://www.chromium.org/developers/coding-style/important-abstractions- and-data-structures ▌ http://www.chromium.org/developers/design-documents/ threading ▌ https://en.wikipedia.org/wiki/Actor_model 37