Upgrade to Pro — share decks privately, control downloads, hide ads and more …

現代の非同期処理

まりも
May 16, 2024
8

 現代の非同期処理

マルチコアのCPUが当たり前の状態になり、非同期処理を当たり前に使わざるを得ない時代が来ています。非同期処理を100%使いこなすことが非常に難しいことは今も昔も同じですが、必要になるに伴い様々な工夫がなされ、アムダールの法則やデータ競合などの狩猟な問題については、すべてではないにせよ多くの場合について普通のプログラマーが使える時代が来ています。それについて解説します。

まりも

May 16, 2024
Tweet

Transcript

  1. 現代の並列処理機能 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
  2. 非同期処理の難しさ 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; }
  3. コールバック地獄 $.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)); }); }); });
  4. 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)); });
  5. 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);
  6. データ競合 public void 預金額を処理する() { var 移動金額 = this.預金額1 /

    2; this.預金額2 = this.預金額2 - 移動金額; this.預金額1 = this.預金額1 + 移動金額; }
  7. 対策(LOCK) class 預金口座 { decimal 残高; private Object thisLock =

    new Object(); public void 預金を下す(decimal 金額) { lock (thisLock) { if (金額> 残高) { throw new Exception("不足しています"); } 残高 -=金額; } } }