Successfully reported this slideshow.
Your SlideShare is downloading. ×

現代の非同期処理

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 70 Ad

現代の非同期処理

Download to read offline

非同期処理はもちろん昔から行われてきましたが、一部の人のものでした。最近は普通のプログラマーが普通に扱う必要が出てきて、扱うレイヤーがこうレイヤーに変わってきています。その辺の事情について解説しました。

非同期処理はもちろん昔から行われてきましたが、一部の人のものでした。最近は普通のプログラマーが普通に扱う必要が出てきて、扱うレイヤーがこうレイヤーに変わってきています。その辺の事情について解説しました。

Advertisement
Advertisement

More Related Content

More from potimarimo (20)

Recently uploaded (20)

Advertisement

現代の非同期処理

  1. 1. 現代の非同期処理 フリーランチが終わった後の世界
  2. 2. フリーランチは終わった
  3. 3. ムーアの法則 集積回路上のトランジスタ数は18 か月ごとに倍になる 出典:Wikipedia
  4. 4. フリーランチが終わる前 1GHz 4GHz プログラムの 変更なし
  5. 5. フリーランチが終わった後 コア コア コア コア コア コア コア プログラムの 変更なし
  6. 6. フリーランチが終わった後の世界 アムダールの 法則
  7. 7. アムダールの法則 1 1 − 𝑃 + 𝑃 𝑆 P:高速化できる割合 S:性能向上率
  8. 8. アムダールの法則 高速化できる割合:100% 性能向上率 :100%
  9. 9. アムダールの法則 高速化できる割合:100% 性能向上率 :200%
  10. 10. アムダールの法則 高速化できる割合:100% 性能向上率 :300%
  11. 11. アムダールの法則 高速化できる割合:100% 性能向上率 :400%
  12. 12. アムダールの法則 高速化できる割合:100% 性能向上率 :100,000%
  13. 13. アムダールの法則 高速化できる割合:50% 性能向上率 :100%
  14. 14. アムダールの法則 高速化できる割合:25% 性能向上率 :100%
  15. 15. アムダールの法則 高速化できる割合:75% 性能向上率 :100%
  16. 16. アムダールの法則 高速化できる割合:75% 性能向上率 :200%
  17. 17. アムダールの法則 性能向上率 :300% 高速化できる割合:75%
  18. 18. アムダールの法則 高速化できる割合:75% 性能向上率 :400%
  19. 19. アムダールの法則 高速化できる割合:75% 性能向上率 :100,000%
  20. 20. アムダールの法則 性能向上率 :100,000% 高速化できる割合:50%
  21. 21. アムダールの法則 高速化できる割合:25% 性能向上率 :100,000%
  22. 22. 並列化できない理由 アルゴリズム的に無理
  23. 23. 並列化できない理由 アルゴリズム的に無理 書くのにコストがかかる
  24. 24. フリーランチが終わって フリーランチは 終わった 高級レストラン にいく? そのくらいなら お昼抜く人多数 安い定食屋がで きるまでは時代 は動かない そろそろ定食屋 ができてきた?
  25. 25. 現代の並列処理機能 async/await C# Visual Basic F# TypeScript Python JavaScript C++ Swift Kotlin Rust Dart Reactive Extensions C# JavaScript Swift Java イミュータ ブル 関数型言語 C# Kotlin オブジェク ト指向言語 アクター Erlan Scala F# Ruby Pony ストリーム C# Java Scala STM Clojure Haskell F# C++ goroutine Go
  26. 26. 並列処理にコストがかかる理由 非同期処 理 データ競 合
  27. 27. 非同期処理
  28. 28. 非同期処理 並列処理 非同期処理
  29. 29. 非同期処理が必要な理由 • フリーランチは終わった • アムダールの法則 並列処理 に必要 GUIに必要
  30. 30. 並列化しない場合でも 並列化は 行わない OSは並 列 非同期処 理は必須
  31. 31. 並列化しない場合でも 画面の反応がなくなる タブレットに不向き Windows8以降では同期処理のメソッドが廃止
  32. 32. 非同期処理が必要な理由 • フリーランチは終わった • アムダールの法則 並列処理 に必要 • 画面を固められない • Windowsならなおさら許さ れない GUIに必要
  33. 33. 非同期処理を書かねばならない場面 全てのプログ ラム
  34. 34. 非同期処理の難しさ public void Download() { WebClient client = new WebClient(); client.DownloadDataCompleted += Client_DownloadDataCompleted; client.DownloadDataAsync("http://www.hoge.co.jp/api/func1/" } private void Client_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e) { byte[] result = e.Result; }
  35. 35. JAVASCRIPT JavaScriptはクロー ジャがあるから非 同期処理が簡単 と言われて いた時代が ありました。
  36. 36. 対策-クロージャ $.getJSON( 'http://www.hoge.co.jp/api/func1', function (data) { alert(JSON.stringify(data)); });
  37. 37. この同期処理に相当するコードを書いて みる var data = func1(); var data2 = func2(data); var data3 = func3(data2); alert(JSON.stringify(data3));
  38. 38. コールバック地獄 $.getJSON( 'http://www.hoge.co.jp/api/func1', function (data) { $.getJSON( 'http://www.hoge.co.jp/api/func2', data, function (data2) { $.getJSON( 'http://www.hoge.co.jp/api/func3', data2, function (data3) { alert(JSON.stringify(data3)); }); }); });
  39. 39. コールバック地獄 クロージャがあるので JavaScriptは非同期処理が 簡単 コールバック地 獄
  40. 40. PROMISEを使っても $.getJSON('http://www.hoge.co.jp/api/func1') .then(function (data) { return $.getJSON('http://www.hoge.co.jp/api/func2', data); }).then(function (data2) { return $.getJSON('http://www.hoge.co.jp/api/func3', data2); }).then(function (data3) { alert(JSON.stringify(data3)); });
  41. 41. 順次実行の難しさ • 1950年代前半以降のほとんどのプログラミング言語 順次実行をしたければ次の行に書けばよい • プログラムが生まれてから数年の間? • 非同期プログラミング 次の行に書くだけではダメ
  42. 42. もっと難しい処理はどうする? • 分岐 • 反復 • 構造化例外 順次実行以外
  43. 43. ASYNC/AWAIT async/await があれば 非同期処理 は何も難し くない
  44. 44. 同期処理ならこのくらいの処理を var data = func1(); var data2 = func2(data); var data3 = func3(data); alert(JSON.stringify(data3));
  45. 45. ASYNC/AWAITを使った非同期処理 var client = new HttpClient(); var data = await client.GetStringAsync(new Uri("http://www.hoge.co.jp/api/func1")); var data2 = await client.GetStringAsync($"http://www.hoge.co.jp/api/func2?{data}"); var data3 = await client.GetStringAsync($"http://www.hoge.co.jp/api/func3?{data2}"); Console.WriteLine(data3);
  46. 46. すべて同期処理を同じように書ける。 • 分岐 • 反復 • 構造化例外 順次実行以外
  47. 47. ASYNC/AWAITの対応言語 C# Visual Basic F# TypeScript Python JavaScript C++ Swift Kotlin Rust Dart
  48. 48. パレードの法則 80:20の法則 async/awaitの特徴 最小限のパターンにのみ対応 必要な理解はほぼない
  49. 49. REACTIVE EXTENSIONS ライブラリ • 非同期に対応 イベントストリーム
  50. 50. 対応する機能があるので大丈夫 • 分岐 • 反復 • 構造化例外 順次実行以外
  51. 51. REACTIVE EXTENSIONSの対応言語 C# Visual Basic JavaScript Swift Java C++
  52. 52. アクターモデル アクターモデルの基本は「全てのものはアクター である」という哲学である。これはオブジェクト 指向プログラミングにおける「全てのものはオブ ジェクトである」という考え方と似ているが、オ ブジェクト指向ソフトウェアでは基本的に逐次的 に実行するのに対して、アクターモデルでは本質 的に並行性を備えている点が異なる。(出 典:Wikipedia)
  53. 53. データ競合
  54. 54. データ競合 public void 預金額を処理する() { var 移動金額 = this.預金額1 / 2; this.預金額2 = this.預金額2 - 移動金額; this.預金額1 = this.預金額1 + 移動金額; }
  55. 55. データ競合 public void Increment() { this.Count++; }
  56. 56. データ競合 public void Add(int i) { list.Add(i); }
  57. 57. 対策(LOCK) class 預金口座 { decimal 残高; private Object thisLock = new Object(); public void 預金を下す(decimal 金額) { lock (thisLock) { if (金額> 残高) { throw new Exception("不足しています"); } 残高 -=金額; } } }
  58. 58. 対策(LOCK) データ 競合 デッドロックに気を付ける 利点 簡単 問題点 ロックをかけた部分は並列処理ができない。 アムダールの法則を考えると大きな問題。
  59. 59. 対策(変数コピー) データ 競合 解決 利点 簡単 問題点 コピーに時間がかかる
  60. 60. 対策(イミュータブル) データ 競合 そもそも起きない 利点 データ競合はおきない 問題点 関数型言語っぽい書き方に直さないと いけない。
  61. 61. 対策(PLINQなど) var result =  from item in list.AsParallel()  where item < 100  select Sqrt(item);
  62. 62. 参考に普通のLINQ var result =  from item in list  where item < 100  select Sqrt(item);
  63. 63. 対策(PLINQなどストリーム) データ 競合 リストのデータ一つ一つに対して処理 する場合 利点 簡単 問題点 多数データを並列の場合しか使えない
  64. 64. 対策(REACTIVE EXTENSIONS) データ 競合 リストのデータ一つ一つに対して処理する場合 イベントストリーム 利点 比較的簡単 対応できる処理も多い 問題点 多数データとイベントを非同期で扱うときしか 使えない
  65. 65. 対策(PONY) データ 競合 対策済み コンパイラによるチェックで確実な対応 利点 並列処理をしっかり意識した書き方ができる Actorの一種 問題点 並列処理をある程度意識しないと使えない
  66. 66. 対策(STM) データ 競合 対策済み 利点 比較的簡単 割と難しいといううわさも 問題点 非同期処理をしっかり意識しないと実装できな い
  67. 67. まとめ
  68. 68. まとめ 全てのコードに並列対応が必要 フリーランチは終わった • アムダールの法則 画面を固めるの禁止
  69. 69. 非同期処理対応 async/await Reactive Extensions アクターモ デル
  70. 70. データ競合対応 データ 競合対 策 ロック コピー イミュー タブル ストリー ム Reactive Extensions スレッド の所有権

×