Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

現代の非同期処理

600 views

Published on

マルチコアの時代が来ても、難しい並列プログラミングは普及していません。 しかし最近やっと、誰でも並列プログラミングが使いこなせるようになりつつあります。 なぜそんなことが可能なのかについて話します。

Published in: Engineering
  • Login to see the comments

現代の非同期処理

  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++ Reactive Extensions C# JavaScript Swift Java イミュータブル 関数型言語 C# オブジェクト 指向言語 アクター Erlan Scala F# Pony ストリーム C# Java Scala STM Clojure Haskell F# C++ goroutine Go Guild Ruby
  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++
  48. 48. REACTIVE EXTENSIONS ライブラリ • 非同期に対応 イベントストリーム
  49. 49. 対応する機能があるので大丈夫 • 分岐 • 反復 • 構造化例外 順次実行以外
  50. 50. REACTIVE EXTENSIONSの対応言語 C# Visual Basic JavaScript Swift Java
  51. 51. アクターモデル アクターモデルの基本は「全てのものはアクター である」という哲学である。これはオブジェクト 指向プログラミングにおける「全てのものはオブ ジェクトである」という考え方と似ているが、オ ブジェクト指向ソフトウェアでは基本的に逐次的 に実行するのに対して、アクターモデルでは本質 的に並行性を備えている点が異なる。(出 典:Wikipedia)
  52. 52. データ競合
  53. 53. データ競合 public void 預金額を処理する() { var 移動金額 = this.預金額1 / 2; this.預金額2 = this.預金額2 - 移動金額; this.預金額1 = this.預金額1 + 移動金額; }
  54. 54. データ競合 public void Increment() { this.Count++; }
  55. 55. データ競合 public void Add(int i) { list.Add(i); }
  56. 56. 対策(LOCK) class 預金口座 { decimal 残高; private Object thisLock = new Object(); public void 預金を下す(decimal 金額) { lock (thisLock) { if (金額> 残高) { throw new Exception("不足しています"); } 残高 -=金額; } } }
  57. 57. 対策(LOCK) データ競合 デッドロックに気を付ける 利点 簡単 問題点 ロックをかけた部分は並列処理ができない。 アムダールの法則を考えると大きな問題。
  58. 58. 対策(変数コピー) データ競合 解決 利点 簡単 問題点 コピーに時間がかかる
  59. 59. 対策(イミュータブル) データ競合 そもそも起きない 利点 データ競合はおきない 問題点 関数型言語っぽい書き方に直さないといけない。
  60. 60. 対策(PLINQなど) var result =  from item in list.AsParallel()  where item < 100  select Sqrt(item);
  61. 61. 参考に普通のLINQ var result =  from item in list  where item < 100  select Sqrt(item);
  62. 62. 対策(PLINQなどストリーム) データ競合 リストのデータ一つ一つに対して処理する場合 利点 簡単 問題点 多数データを並列の場合しか使えない
  63. 63. 対策(REACTIVE EXTENSIONS) データ競合 リストのデータ一つ一つに対して処理する場合 イベントストリーム 利点 比較的簡単 対応できる処理も多い 問題点 多数データとイベントを非同期で扱うときしか使えない
  64. 64. 対策(GUILD) データ競合 対策済み 利点 並列処理をしっかり意識した書き方ができる Actorの一種? 問題点 並列処理をある程度意識しないと使えない?
  65. 65. 対策(PONY) データ競合 対策済み コンパイラによるチェックで確実な対応 利点 並列処理をしっかり意識した書き方ができる Actorの一種 問題点 並列処理をある程度意識しないと使えない
  66. 66. 対策(STM) データ競合 対策済み 利点 比較的簡単 割と難しいといううわさも 問題点 非同期処理をしっかり意識しないと実装できない
  67. 67. まとめ
  68. 68. まとめ 全てのコードに並列対応が必要 フリーランチは終わった • アムダールの法則 画面を固めるの禁止
  69. 69. 非同期処理対応 async/await Reactive Extensions アクターモデル
  70. 70. データ競合対応 データ競 合対策 ロック コピー イミュー タブル ストリー ム Reactive Extensions Guild スレッド の所有権

×