Причины потерь процессорного времени при организации последовательности вычислений внутри потока: 1. Ожидание ответа на запрос (поток спит). 2. Выполнение дополнительных "лишних" действий. Как способ устранения этих потерь - паттерн Пул потоков. Анализ императивного и функционального подхода к борьбе с "жадными" операциями. Эволюция методов организации параллельных вычислений на основе пула потоков.
16. Императивность тоже может! 45
while(условие)
{
//тело цикла
Здесь может быть код, который будет
передавать эстафету в другой поток
вычислений
}
17. А как же эффективность? 46
Philipp Haler, Martin
Odersky
Event-Based
Programming Without
Inversion Control
2006 Scala, C# 5 (await)
18. Пример await на C# 47
static async Task SavePage(string file, string a)
{
using (var stream = File.AppendText(file))
{
var html = await new
WebClient().DownloadStringTaskAsync(a);
await stream.WriteAsync(html);
}
}
20. Что делать? 49
Делегирование
Передать выполнение задач в другой поток
21. Ограничения делегирования 50
Трудоемкость делегируемой задачи vs время
на ее передачу
• Чем меньше размер делегируемой задачи,
тем ниже КПД (закон Амдала)
• => Запуск потока по требованию – слишком
дорогая операция
22. Ограничения делегирования 51
Количество потоков vs время на управление
потоками
• Слишком большое число потоков приводит
к потерям производительности
• При небольшом числе потоков количество
текущих задач больше числа потоков =>
нужна очередь задач
23. Архитектура Fog cutter 52
Gul A. Agha,
Karmani 2011
Распространенная
архитектура для
вычислительных
агентов
25. Эволюция асинхронности 54
2. Асинхронные callback’s
public class MyClass {
public IAsyncResult BeginSend(string host, int port, byte[] buffer,
int offset, int size, AsyncCallback asyncCallback, object state) {
SendAsyncResult result = new SendAsyncResult( host, port, bufferБ
offset, size, asyncCallback, state, this /*owner*/, "send");
result.Process();
return result;
}
public void EndSend(IAsyncResult result)
{
AsyncResultNoResult.End(result, this, "send");
}
}
26. Эволюция асинхронности 55
3. Оператор await
static async Task SavePage(string file, string a)
{
using (var stream = File.AppendText(file))
{
var html = await new
WebClient().DownloadStringTaskAsync(a);
await stream.WriteAsync(html);
}
}
27. Эволюция асинхронности 56
4. Библиотеки для параллельных циклов и не
только
foreach (var item in sourceCollection) {
Process(item);
}
Parallel.ForEach(sourceCollection, item =>
Process(item));
28. Эволюция асинхронности 57
Встраивание конструкций в язык
?????
par_foreach (var item in sourceCollection) {
Process(item);
}
29. Эволюция асинхронности 58
1. Пул потоков
2. Асинхронные callback’s
3. Оператор await
4. Библиотеки для параллельного циклов и не
только
5. Встраивание конструкций в язык