SlideShare a Scribd company logo
1 of 40
Download to read offline
これからの 「async/await」の 話 をしよう 
名古屋GeekBar2014/09/08Center CLR Kouji Matsui (@kekyo2)
Profile 
 けきょTwitter:@kekyo2 Blog: www.kekyo.net 
 自転車復活! 
 ビッグウェーブAzure+独自ドメインに移行 
JAZUG名古屋9/20 でネタやります 
(http://jazug.doorkeeper.jp/events/14706)
Agenda 
非同期処理の必要性とは? 
Hello world的な非同期 
スレッドとの関係は? 
非同期対応メソッドとは? 
LINQでの非同期 
競合条件の回避 
非同期処理のデバッグ 
もりすぎにゃー
時代は非同期!! 
ストアアプリ(WinRT)環境では、外部リソースへのアクセスは非同期しかない。 
ASP.NETでも、もはや使用は当たり前。 
大規模実装事例も出てきた。 グラニさん「神獄のヴァルハラゲート」http://gihyo.jp/dev/serial/01/grani/0001 
C# 2.0レベルの技術者は、これを逃すと、 
悲劇的に追従不能になる可能性があるワ。 
そろそろCやJava技術者の転用も不可能ネ。 
→ 実績がないよねー、とか、 
いつの話だ的な
何で非同期? 
過去にも技術者は非同期処理にトライし続けてきた。 
基本的にステート管理が必要になるので、プログラムが複雑化する。 (ex : 超巨大switch-caseによる、ステート遷移の実装) 
それを解消するために、「マルチスレッド」が考案された。 
マルチスレッドは、コンテキストスイッチ(CPUが沢山あるように見せかける、OSの複 雑な機構)にコストが掛かりすぎる。 
→ 揉まれてけなされてすったもんだした挙句、 
遂に「async-await」なる言語機能が生み出された
Hello 非同期! 
クラウディア窓辺公式サイトから、素材のZIPファイルをダウンロードしつつ、 リストボックスにイメージを表示します。 
ワタシが表示されるアプリね 
中には素材画像が入ってるワ。 
もちろん、ダウンロードとZIPの展開は 
オンザフライ、GUIはスムーズなのヨネ?
この辺から、UIが絡む 
処理の流れ(構想) 
ウェブサイト 
zip 
HttpClient 
0 
1 
2 
3 
4 
ZipReader 
zip 
JpegBitmapDecoder 
ListBox 
Zipをダウンロード 
オンザフライ解凍 
JPEG画像データ 
データバインディング 
流れるようにデータを受け渡して、凝ったロジックの 仕掛けを入れないようにして行きたい
問題点の整理 
ウェブサイトからダウンロードする時に、時間がかかる可能性がある。 GUIが操作不能にならないようにするには、ワーカースレッドを使う必要がある。 → ヤダ(某技術者談) 
ZIPファイルを展開し、個々のJPEGファイルをビットマップデータとして展開するのに、 時間がかかる可能性がある。 GUIが操作不能にならないようにするには、ワーカースレッドを使う必要がある。 → ヤダ(某技術者談) 
_人人人人人人_ >ヤダ<  ̄^Y^Y^Y^Y^Y^Y ̄ 
斧投げていいすか?(怒
Hello 非同期!(非同期処理開始) 
イベントハンドラが実行されると、 
awaitの手前までを実行し… 
すぐに退出してしまう!! 
(読み取りを待たない) 
スレッド1 
スレッド1 
スレッド1=メインスレッド(UIスレッド) 
スレッド退出時にusing句の Disposeは呼び出されません。 
あくまでまだ処理は継続中。
Hello 非同期!(非同期処理実行中) 
非同期処理 
スレッド1 
他ごとをやってる。 
=GUIはブロックされない 
カーネル・ハードウェアが 
勝手に実行
Hello 非同期!(非同期処理完了) 
await以降を継続実行 
スレッド1 
スレッド1 
非同期処理 
処理の完了がスレッド1に 通知され… 
完了 
スレッド1が処理を継続実行 
していることに注意!!
少しawaitをバラしてみる 
C# 4.0での非同期処理は、ContinueWithを使用して継続処理を書いていました。 
スレッド1 
スレッド1 
このラムダ式は、 
コールバックとして実行される 
非同期処理 
スレッド2 
JavaScriptの 
イベントコールバックに近い
これが…こうなった 
await以降がコールバック実行されているという イメージがあれば、async-awaitは怖くない!
await以降の処理を行うスレッド 
awaitで待機後の処理は、メインスレッド(スレッド1・UIスレッド)が実行する。 
そのため、Dispatcherを使って同期しなくても、GUIを直接操作できる。 
メインスレッドへの処理の移譲は、Taskクラス内で、SynchronizationContextクラスを暗黙に使用す ることで実現している。 
が、 
→とりあえず、UIスレッド上でawaitした場合は、 
非同期処理完了後の処理も、自動的にUIスレッドで 
実行されることを覚えておけばOK 
(WPF/WP/ストアアプリの場合)。
非同期対応メソッドとは?(HttpClientの例) 
メソッド名に「~Async」と 
付けるのは慣例 
Taskクラスを返す 
内部でasync-awaitを使って 
いるかどうかは関係ない
ところで、応答性が悪い… 
待つこと数十秒。 
しかも、その間GUIがロック… 
いきなり全件表示 
何コレ… (怒
非同期にしたはずなんです… 
非同期処理にしたのは、HttpClientがウェブサーバーに要求を投げて、HTTP接続が確立 された所までです。 
非同期処理 
ここの処理は同期実行、 
しかもメインスレッドで! 
=ここが遅いとGUIがロックする
列挙されたイメージデータをバインディング 
メソッド全体が普通の同期メソッドなので、 
ExtractImagesが内部でブロックされれば、 
当然メインスレッドは動けない。 
スレッド1 
ExtractImagesメソッドが返す 
「イテレーター(列挙子)」を列挙しながら、 
バインディングしているコレクションに追加。 
ObservableCollection<T>なので、 
Addする度にListBoxに通知されて 
表示が更新される。
肝心な部分の実装も非同期対応にしなきゃ! 
ストリームをZIPファイルとして解析しつつ、 
JPEGファイルであればデコードして 
イメージデータを返す 
「イテレーター(列挙子)」 
ZipReader(ShartCompress) を使うことで、 
解析しながら、逐次処理を行う事が出来る。 
=全てのファイルを解凍する必要がない 
しかし、ZipReaderもJpegBitmapDecoderも、 
非同期処理には対応していない。 
スレッド1
非同期対応ではない処理を対応させる 
非同期対応じゃない処理はどうやって非同期対応させる? 
「ワーカースレッド」で非同期処理をエミュレーションします。 
えええ??
ワーカースレッド≠ System.Threading.Thread 
ワーカースレッドと言っても、System.Threading.Threadは使いません。 
System.Threading.ThreadPool.QueueUserWorkItemも使いません。 
これらを使って実現することも出来ますが、もっと良い方法があります。 
それが、TaskクラスのRunメソッドです
Task.Run() 
処理をおこなうデリゲートを指定 
Taskクラスを返却 
結局はThreadPoolだが…
ワーカースレッドをTask化する 
イテレーターを列挙していた処理を 
Task.Runでワーカースレッドへ 
ワーカースレッドで実行するので、 
Dispatcherで同期させる必要がある。 
スレッド1 
Task.Runはすぐに処理を返す。 
その際、Taskクラスを返却する。 
スレッド1 
スレッド2
呼び出し元から見ると、まるで非同期メソッド 
Taskクラスを返却するので、 
そのままawait可能。 
スレッド1 
スレッド1 
ワーカースレッド処理完了後は、 
awaitの次の処理(Dispose)が実行される。
ワーカースレッドABC 
TaskCompletionSource<T>クラスを使えば、受動的に処理の完了を通知できるTaskを作れるので、 これを使って従来のThreadクラスを使うことも出来ます。 (ここでは省略。詳しくはGitHubのサンプルコードを参照) 
ワーカースレッドを使わないんじゃなかったっけ? →「非同期対応メソッドが用意されていることが前提」です。 そもそも従来のようなスレッドブロック型APIでは、このような動作は実現出来ません。 
ということは、当然、スレッドブロック型APIには、対応する非同期対応バージョンも欲しいよね。 →WinRTでやっちゃいました、徹底的に(スレッドブロック型APIは駆逐された)。 
非同期処理で応答性の高いコードを書こうとすると、 結局ブロックされる可能性のAPIは全く使えない事になる。 
だから、これからのコードには 
非同期処理の理解が必須になるのヨ
非同期処理vs ワーカースレッド 
全部Task.Runで書けば良いのでは? →Task.Runを使うと、ワーカースレッドを使ってしまう。 ThreadPoolは高効率な実装だけど、それでもCPUが処理を実行するので、従来の手法と変わら なくなってしまう。 
(ネイティブな)非同期処理は、ハードウェアと密接に連携し、CPUのコストを可能な限り使わず に、並列実行を可能にする(CPU Work OffLoads)。 →結果として、よりCPUのパワーを発揮する事が出来ます。 (Blogで連載しました。参考にどうぞhttp://www.kekyo.net/category/net/async/) 
Task.Runを使用する契機としては、二つ考えられます。区別しておくこと。 
CPU依存型処理(計算ばっかり長時間)。概念的に、非同期処理ではありません。 →まま、仕方がないパターン。だって計算は避けられないのだから。 
レガシーAPI(スレッドブロック型API)の非同期エミュレーション。 →CPU占有コストがもったいないので、出来れば避けたい。
LINQでも非同期にしたいよね… 
LINQの「イテレーター」と相性が悪い。 → メソッドが「Task<IEnumerable<T>>」を返却しても、列挙実行の実態が 「IEnumerator<T>.MoveNext()」にあり、このメソッドは非同期バージョンがない。 
EntityFrameworkにこんなインターフェイスががが。 
しかし、MoveNextAsyncを誰も理解しないので、 
応用性は皆無…
隙間を埋めるRx 
 単体の同期処理の結果は、「T型」 
 複数の同期処理の結果は、「IEnumerable<T>型」 
 単体の非同期処理の結果は、「Task<T>型」非同期処理 
LINQ (Pull) 
ただの手続き型処理 
T T T T T 
複数の結果が不定期的(非同期) 
にやってくる(Push) Observer<T> 
データが来たら処理 
(コールバック処理) 
Observable<T> 
 複数の非同期処理の結果は、「IObservable<T>型」 
Reactive Extensions (Push)
イメージ処理をRxで実行 
LINQをRxに変換。 
列挙子の引き込みを 
スレッドプールのスレッドで実施 
以降の処理をDispatcher経由 
(つまりメインスレッド)で実行 
要素毎にコレクションに追加。 
完全に終了する(列挙子の列挙する要素 がなくなる)とTaskが完了する 
列挙子(LINQ)
Rxのリレー 
IEnumerable<T> 0 1 2 3 4 ToObservable() 0 1 2 3 4 
ワーカースレッドが要素を 
取得しながら、細切れに送出 
Pull Push 
ObserveOn 
Dispatcher() 
メインスレッドが要素を 
受け取り、次の処理へ 
ForEachAsync() 
Task 
これら一連の処理を表すTask。 
完了は列挙が終わったとき 
WPF 
ListBox 
Observable 
Collection 
Binding
Rxについてもろもろ 
LINQ列挙子のまま、非同期処理に持ち込む方法は、今のところ存在しません。 IObservable<T>に変換することで、時間軸基準のクエリを書けるようになるが、慣れが必要です。 →個人的にはforeachとLINQ演算子がawaitに対応してくれれば、もう少し状況は良くなる気がする。 http://channel9.msdn.com/Shows/Going+Deep/Rx-Update-Async-support-IAsyncEnumerable- and-more-with-Jeff-and-Wes 
Rxは、Observableの合成や演算に真価があるので、例で見せたような単純な逐次処理には、あまり旨みが ありません。それでもコード量はかなり減ります。 
xin9leさん: Rx入門 http://xin9le.net/rx-intro 
初めてx^2=-1 を導入した時の 
ようなインパクトがあります、 いろいろな意味で。
非同期処理にも競合条件がある 
同時に動くのだから、当然競合条件があります。 
ボタンを連続でクリックする 
画像がいっぱい入り乱れて 
表示される 
こ、これはこれで良いかも?
競合条件の回避あるある 
この場合は、単純に処理開始時にボタンを無効化、処理完了時に再度有効化すれば良いでしょう。 
従来的なマルチスレッドの競合回避知識しかない場合の、「あるある」 
error CS1996: 'await' 演算子は、lock ステートメント本体では使用できません。
モニターロックはTaskに紐づかない 
モニターロックはスレッドに紐づき、Taskには紐づきません。無理やり実行すると、容易に デッドロックしてしまう。 
同様に、スレッドに紐づく同期オブジェクト(ManualResetEvent, AutoResetEvent, Mutex, Semaphoreなど)も、Taskに紐づかないので、同じ問題を抱えています。 
Monitor.EnterやWaitHandle.WaitAny/WaitAllメソッドが非同期対応(awaitable)ではな いことが問題(スレッドをハードブロックしてしまう)。 
えええ、じゃあどうやって競合 を回避するの?!
とってもすごいライブラリ! 
Nito.AsyncEx(NuGetで導入可) 
モニター系・カーネルオブジェクト系の同期処理を模倣し、非同期対応にしたライブラリです。 だから、とても馴染みやすい、分かりやすい! 
await可能なlockとして使える 
AsyncSemaphoreを使えば、 
同時進行するタスク数を制御可能
ストアアプリではTaskクラスを使わない? 
今までの内容の応用ですよ! 
ストアアプリ固有の名前空間に存在するクラス群(WinRTAPI)では、非同期処理をTaskクラスで 返しません。 
その代わり、IAsyncInfoインターフェイスやIAsyncOperation<T>インターフェイスを返します。 
これらのインターフェイスに対して、直接awaitすることが出来ます。これは、GetAwaiter拡張 メソッドが定義されていることで実現しています。 
また、上記インターフェイスをTaskクラスに変換することが出来ます。それがAsTask拡張メソッ ドです。Taskクラスに変換することで、既存のTaskクラスを使用した様々なメソッドで応用する 事が出来ます。 
WinRTとawait を掘り下げる (http://blogs.msdn.com/b/windowsappdev_ja/archive/2012/04/30/winrt-await.aspx) 
.NET タスクをWinRT非同期処理として公開する (http://blogs.msdn.com/b/windowsappdev_ja/archive/2012/06/25/net-winrt.aspx)
非同期処理のデバッグ 
「並列スタックウインドウ」 
いろいろなスレッドとの関係がわかりやすい 
「タスクウインドウ」 
タスクはスレッドに紐づかない 
→スタックトレースを参照してもムダ
まとめ 
ブロックされる可能性のある処理は、すべからくTaskクラスを返却可能でなければなりません。 でないと、Task.Runを使ってエミュレーションする必要があり、貴重なCPUリソースを使う ことになります。そのため、続々と非同期対応メソッドが追加されています。 
CPU依存性の処理は、元々非同期処理に分類されるものではありません。これらの処理は、 ワーカースレッドで実行してもかまいません。その場合に、Task.Runを使えば、Taskに紐づ かせることが簡単に出来るため、非同期処理と連携させるのが容易になります。 
連続する要素を非同期で処理するためには、LINQをそのままでは現実的に無理です。Rxを使 用すれば、書けないこともない。いかに早く習得するかがカギかな… 
非同期処理にも競合条件は存在します。そこでは、従来の手法が 通用しません。外部ライブラリの助けを借りるか、そもそも 競合が発生しないような仕様とします。 
フフフ
何かいろいろ足りないな… 
awaitが適用できるメソッドの条件は? 
GetAwaiterメソッドって? 
MVVMでどうやるの? 
スレッドとタスクの関係がどうも分からない? 
パフォーマンスが上がらない場合の注意点? 
ユニットテストどうやるの? 
…
ありがとうございました 
本日のコードはGitHubに上げてあります。 https://github.com/kekyo/AsyncAwaitDemonstration 
このスライドもブログに掲載予定です。 http://www.kekyo.net/ 
おいしいにゃー? 
11/1 Unveiled! 
名古屋北生涯学習センター第三集会室 
広報を待て!!

More Related Content

What's hot

BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニーUnity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニーYoshifumi Kawai
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫Yuta Imai
 
Flutter移行の苦労と、乗り越えた先に得られたもの
Flutter移行の苦労と、乗り越えた先に得られたものFlutter移行の苦労と、乗り越えた先に得られたもの
Flutter移行の苦労と、乗り越えた先に得られたものRecruit Lifestyle Co., Ltd.
 
パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理Kouji Matsui
 
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話Yuhei Miyazato
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Etsuji Nakai
 
2015-10-31 クラウドネイティヴ時代の運用を考える 〜 ドキュメント駆動運用へ
2015-10-31 クラウドネイティヴ時代の運用を考える  〜 ドキュメント駆動運用へ2015-10-31 クラウドネイティヴ時代の運用を考える  〜 ドキュメント駆動運用へ
2015-10-31 クラウドネイティヴ時代の運用を考える 〜 ドキュメント駆動運用へOperation Lab, LLC.
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Shin Ohno
 
Java仮想マシンの実装技術
Java仮想マシンの実装技術Java仮想マシンの実装技術
Java仮想マシンの実装技術Kiyokuni Kawachiya
 
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!Teruchika Yamada
 
大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化DeNA
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来についてshinjiigarashi
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るGo Miyasaka
 
Fargateを使いこなす!creatiaのインフラを支える技術について
Fargateを使いこなす!creatiaのインフラを支える技術についてFargateを使いこなす!creatiaのインフラを支える技術について
Fargateを使いこなす!creatiaのインフラを支える技術について虎の穴 開発室
 

What's hot (20)

BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話
 
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニーUnity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
 
Flutter移行の苦労と、乗り越えた先に得られたもの
Flutter移行の苦労と、乗り越えた先に得られたものFlutter移行の苦労と、乗り越えた先に得られたもの
Flutter移行の苦労と、乗り越えた先に得られたもの
 
パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理
 
WordPressのCDN化
WordPressのCDN化WordPressのCDN化
WordPressのCDN化
 
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
2015-10-31 クラウドネイティヴ時代の運用を考える 〜 ドキュメント駆動運用へ
2015-10-31 クラウドネイティヴ時代の運用を考える  〜 ドキュメント駆動運用へ2015-10-31 クラウドネイティヴ時代の運用を考える  〜 ドキュメント駆動運用へ
2015-10-31 クラウドネイティヴ時代の運用を考える 〜 ドキュメント駆動運用へ
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
 
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。 【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
 
Java仮想マシンの実装技術
Java仮想マシンの実装技術Java仮想マシンの実装技術
Java仮想マシンの実装技術
 
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
 
大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
 
リペア時間短縮にむけた取り組み@Yahoo! JAPAN #casstudy
リペア時間短縮にむけた取り組み@Yahoo! JAPAN #casstudyリペア時間短縮にむけた取り組み@Yahoo! JAPAN #casstudy
リペア時間短縮にむけた取り組み@Yahoo! JAPAN #casstudy
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
Fargateを使いこなす!creatiaのインフラを支える技術について
Fargateを使いこなす!creatiaのインフラを支える技術についてFargateを使いこなす!creatiaのインフラを支える技術について
Fargateを使いこなす!creatiaのインフラを支える技術について
 

Viewers also liked

continuatioN Linking
continuatioN LinkingcontinuatioN Linking
continuatioN LinkingKouji Matsui
 
Async deepdive before de:code
Async deepdive before de:codeAsync deepdive before de:code
Async deepdive before de:codeKouji Matsui
 
Developers Summit 2014 【13-D-7】 コミュニティLT - Story 5. 「新人技術者にどうプログラミングを教えたか」
Developers Summit 2014 【13-D-7】 コミュニティLT - Story 5. 「新人技術者にどうプログラミングを教えたか」Developers Summit 2014 【13-D-7】 コミュニティLT - Story 5. 「新人技術者にどうプログラミングを教えたか」
Developers Summit 2014 【13-D-7】 コミュニティLT - Story 5. 「新人技術者にどうプログラミングを教えたか」Fujio Kojima
 
ChordアルゴリズムによるDHT入門
ChordアルゴリズムによるDHT入門ChordアルゴリズムによるDHT入門
ChordアルゴリズムによるDHT入門Hiroya Nagao
 
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonadKouji Matsui
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践Yoshifumi Kawai
 

Viewers also liked (6)

continuatioN Linking
continuatioN LinkingcontinuatioN Linking
continuatioN Linking
 
Async deepdive before de:code
Async deepdive before de:codeAsync deepdive before de:code
Async deepdive before de:code
 
Developers Summit 2014 【13-D-7】 コミュニティLT - Story 5. 「新人技術者にどうプログラミングを教えたか」
Developers Summit 2014 【13-D-7】 コミュニティLT - Story 5. 「新人技術者にどうプログラミングを教えたか」Developers Summit 2014 【13-D-7】 コミュニティLT - Story 5. 「新人技術者にどうプログラミングを教えたか」
Developers Summit 2014 【13-D-7】 コミュニティLT - Story 5. 「新人技術者にどうプログラミングを教えたか」
 
ChordアルゴリズムによるDHT入門
ChordアルゴリズムによるDHT入門ChordアルゴリズムによるDHT入門
ChordアルゴリズムによるDHT入門
 
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonad
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
 

Similar to これからの「async/await」の話をしよう

ふつうのcore.async
ふつうのcore.asyncふつうのcore.async
ふつうのcore.asyncTsutomu Yano
 
Pythonの非同期処理を始める前に
Pythonの非同期処理を始める前にPythonの非同期処理を始める前に
Pythonの非同期処理を始める前にkoralle
 
食べログで動いている自作ライブラリのお話
食べログで動いている自作ライブラリのお話食べログで動いている自作ライブラリのお話
食べログで動いている自作ライブラリのお話Tsukasa Oishi
 
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfestay_taka_23
 
async/await不要論
async/await不要論async/await不要論
async/await不要論bleis tift
 
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法Kazuto Kusama
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackTakahiro Yoshimura
 
クラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれクラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれMasataka MIZUNO
 
ご注文は監視自動化ですか?
ご注文は監視自動化ですか?ご注文は監視自動化ですか?
ご注文は監視自動化ですか?Masahito Zembutsu
 
An Internal of LINQ to Objects
An Internal of LINQ to ObjectsAn Internal of LINQ to Objects
An Internal of LINQ to ObjectsYoshifumi Kawai
 
Serverless frameworkを使ってみた話 at #nseg #90
Serverless frameworkを使ってみた話 at #nseg #90Serverless frameworkを使ってみた話 at #nseg #90
Serverless frameworkを使ってみた話 at #nseg #90ko ty
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in DartGoro Fuji
 
Async DeepDive basics
Async DeepDive basicsAsync DeepDive basics
Async DeepDive basicsKouji Matsui
 
インフラ系自主トレするならAWS
インフラ系自主トレするならAWSインフラ系自主トレするならAWS
インフラ系自主トレするならAWSYasuhiro Araki, Ph.D
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんかcch-robo
 
お手軽Ajaxアプリケーションの作り方
お手軽Ajaxアプリケーションの作り方お手軽Ajaxアプリケーションの作り方
お手軽Ajaxアプリケーションの作り方Shunji Konishi
 
Clean Architectureで設計してRxJSを使った話
Clean Architectureで設計してRxJSを使った話Clean Architectureで設計してRxJSを使った話
Clean Architectureで設計してRxJSを使った話_kondei
 

Similar to これからの「async/await」の話をしよう (20)

ふつうのcore.async
ふつうのcore.asyncふつうのcore.async
ふつうのcore.async
 
Pythonの非同期処理を始める前に
Pythonの非同期処理を始める前にPythonの非同期処理を始める前に
Pythonの非同期処理を始める前に
 
食べログで動いている自作ライブラリのお話
食べログで動いている自作ライブラリのお話食べログで動いている自作ライブラリのお話
食べログで動いている自作ライブラリのお話
 
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
 
async/await不要論
async/await不要論async/await不要論
async/await不要論
 
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hack
 
歌舞伎座Tech Rx会
歌舞伎座Tech Rx会歌舞伎座Tech Rx会
歌舞伎座Tech Rx会
 
クラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれクラウド開発に役立つ OSS あれこれ
クラウド開発に役立つ OSS あれこれ
 
ご注文は監視自動化ですか?
ご注文は監視自動化ですか?ご注文は監視自動化ですか?
ご注文は監視自動化ですか?
 
An Internal of LINQ to Objects
An Internal of LINQ to ObjectsAn Internal of LINQ to Objects
An Internal of LINQ to Objects
 
Serverless frameworkを使ってみた話 at #nseg #90
Serverless frameworkを使ってみた話 at #nseg #90Serverless frameworkを使ってみた話 at #nseg #90
Serverless frameworkを使ってみた話 at #nseg #90
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
kamatte(かまって)
kamatte(かまって)kamatte(かまって)
kamatte(かまって)
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in Dart
 
Async DeepDive basics
Async DeepDive basicsAsync DeepDive basics
Async DeepDive basics
 
インフラ系自主トレするならAWS
インフラ系自主トレするならAWSインフラ系自主トレするならAWS
インフラ系自主トレするならAWS
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
お手軽Ajaxアプリケーションの作り方
お手軽Ajaxアプリケーションの作り方お手軽Ajaxアプリケーションの作り方
お手軽Ajaxアプリケーションの作り方
 
Clean Architectureで設計してRxJSを使った話
Clean Architectureで設計してRxJSを使った話Clean Architectureで設計してRxJSを使った話
Clean Architectureで設計してRxJSを使った話
 

More from Kouji Matsui

Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018Kouji Matsui
 
Matrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overviewMatrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overviewKouji Matsui
 
What's Functional?
What's Functional?What's Functional?
What's Functional?Kouji Matsui
 
Pitfall for WioLTE
Pitfall for WioLTEPitfall for WioLTE
Pitfall for WioLTEKouji Matsui
 
How to make the calculator
How to make the calculatorHow to make the calculator
How to make the calculatorKouji Matsui
 
Write common, run anywhere
Write common, run anywhereWrite common, run anywhere
Write common, run anywhereKouji Matsui
 
Locality of Reference
Locality of ReferenceLocality of Reference
Locality of ReferenceKouji Matsui
 
Nespのコード生成
Nespのコード生成Nespのコード生成
Nespのコード生成Kouji Matsui
 
You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.Kouji Matsui
 
How to meets Async and Task
How to meets Async and TaskHow to meets Async and Task
How to meets Async and TaskKouji Matsui
 
Beachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JITBeachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JITKouji Matsui
 
Thread affinity and CPS
Thread affinity and CPSThread affinity and CPS
Thread affinity and CPSKouji Matsui
 
真Intermediate languageのキホン
真Intermediate languageのキホン真Intermediate languageのキホン
真Intermediate languageのキホンKouji Matsui
 
.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組みKouji Matsui
 
Win32 APIをてなずけよう
Win32 APIをてなずけようWin32 APIをてなずけよう
Win32 APIをてなずけようKouji Matsui
 
式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式Kouji Matsui
 
不健康なIt戦士を健康的にするアレの話
不健康なIt戦士を健康的にするアレの話不健康なIt戦士を健康的にするアレの話
不健康なIt戦士を健康的にするアレの話Kouji Matsui
 
Final LINQ extensions III
Final LINQ extensions IIIFinal LINQ extensions III
Final LINQ extensions IIIKouji Matsui
 
SourceTreeで始めよう! Gitへの乗り換え指南
SourceTreeで始めよう! Gitへの乗り換え指南SourceTreeで始めよう! Gitへの乗り換え指南
SourceTreeで始めよう! Gitへの乗り換え指南Kouji Matsui
 

More from Kouji Matsui (20)

Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018
 
Matrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overviewMatrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overview
 
Fun with BrainPad
Fun with BrainPadFun with BrainPad
Fun with BrainPad
 
What's Functional?
What's Functional?What's Functional?
What's Functional?
 
Pitfall for WioLTE
Pitfall for WioLTEPitfall for WioLTE
Pitfall for WioLTE
 
How to make the calculator
How to make the calculatorHow to make the calculator
How to make the calculator
 
Write common, run anywhere
Write common, run anywhereWrite common, run anywhere
Write common, run anywhere
 
Locality of Reference
Locality of ReferenceLocality of Reference
Locality of Reference
 
Nespのコード生成
Nespのコード生成Nespのコード生成
Nespのコード生成
 
You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.
 
How to meets Async and Task
How to meets Async and TaskHow to meets Async and Task
How to meets Async and Task
 
Beachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JITBeachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JIT
 
Thread affinity and CPS
Thread affinity and CPSThread affinity and CPS
Thread affinity and CPS
 
真Intermediate languageのキホン
真Intermediate languageのキホン真Intermediate languageのキホン
真Intermediate languageのキホン
 
.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み
 
Win32 APIをてなずけよう
Win32 APIをてなずけようWin32 APIをてなずけよう
Win32 APIをてなずけよう
 
式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式
 
不健康なIt戦士を健康的にするアレの話
不健康なIt戦士を健康的にするアレの話不健康なIt戦士を健康的にするアレの話
不健康なIt戦士を健康的にするアレの話
 
Final LINQ extensions III
Final LINQ extensions IIIFinal LINQ extensions III
Final LINQ extensions III
 
SourceTreeで始めよう! Gitへの乗り換え指南
SourceTreeで始めよう! Gitへの乗り換え指南SourceTreeで始めよう! Gitへの乗り換え指南
SourceTreeで始めよう! Gitへの乗り換え指南
 

これからの「async/await」の話をしよう