Observable (プログラミング)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/09/05 05:36 UTC 版)
Observable(オブザーバブル)とは、プログラミングにおける非同期処理の一つの手法であり、イベント駆動プログラミングにおいて重要な役割を果たす[1][2]。Observableは、オブザーバーパターンに基づいて構築されており、サブスクリプションを通じてイベントやデータの変化を監視し、通知を受け取る仕組みである。この仕組みにより、リアクティブプログラミングの基礎を構成し、データストリームを処理するための様々なオペレーターが提供される。
プログラミング言語毎にObservableの実装は異なり、Python、Java、JavaScript、C#などの言語において特定のライブラリやフレームワークを通じて実現されている。例えば、RxPY[3][4]、RxJava[1][5]、RxJS[6][7]、.NET[2][8]のObservableが代表的な実装例である。これらの実装では、データのシーケンスを非同期で処理し、エラー処理やメモリ管理の機能も備えている。
ObservableはWebアプリケーションのデータストリーミングやリアクティブプログラミング[1][9]、マイクロサービス間の非同期通信[1][10]、ゲーム開発[11][12]など、幅広い分野で応用されている。特に非同期処理においては、スケーラビリティやパフォーマンス向上のために有用であるが、その一方でデバッグの難しさや学習曲線の高さなどの課題も存在する。
また、Observableはプロミスやフューチャーといった他の非同期プログラミングモデルと比較されることが多く、それぞれの技術との違いやメリットを理解することで、適切な選択が可能となる[1][2]。Observableの進化は、リアクティブプログラミングの発展と共に続いており、現在も様々な分野で利用され続けている。
このページでは、Observableの基本概念、構造、実装、応用例、メリットと欠点、関連技術、そして歴史と発展について詳述する。
序論
概要
Observableは、非同期処理を効率的に管理するためのプログラミング手法であり、イベント駆動型プログラミングの一環として用いられる[1][6]。Observableを使用することで、データのストリームやイベントの連続的な発生を監視し、処理の結果をリアルタイムに通知することができる。この仕組みにより、リアクティブプログラミングが可能となり、動的で応答性の高いアプリケーションの開発が容易になる。
背景と歴史
Observableの概念は、オブザーバーパターンに基づいており、特に非同期処理の複雑さを軽減するために発展してきた[1][13]。オブザーバーパターン自体は、ソフトウェアのデザインパターンとして広く認識されており、特定のイベントやデータの変化を監視するための手段として長年使用されてきた。リアクティブプログラミングの台頭により、Observableはより広範な関心を集めるようになり、様々なプログラミング言語やフレームワークで実装されるようになった。こうした技術の進化は、現代のアプリケーションが求める高いリアクティブ性(敏感さ)やスケーラビリティに対応するために重要な役割を果たしている。
基本概念
Observableとは
Observableとは、データのストリームやイベントの連続的な発生を監視し、処理の結果をリアルタイムに通知するためのプログラミング手法である[1][6]。Observableを使用すると、データの流れを直感的に表現でき、非同期処理をより簡単に管理できる。サブスクライブされたオブザーバーは、データの発生源からの通知を受け取り、それに基づいて適切な処理を実行する。
イベント駆動プログラミングにおける役割
イベント駆動プログラミングでは、ユーザーの操作やシステムイベントに応じて処理が実行される[1][2]。Observableは、このイベント駆動型の環境において、イベントの発生と処理の流れを効率的に管理するためのツールとして重要な役割を果たす。例えば、ユーザーインターフェースのイベント(クリックや入力)を監視し、それに応じてリアルタイムで処理を行うことができる。また、データストリームを利用することで、動的なデータの更新にも対応できる。
他の非同期プログラミングモデルとの比較
Observableは、プロミスやフューチャーなどの他の非同期プログラミングモデルと比較されることが多い[1][14]。プロミスは単一の非同期処理の結果を扱うのに対し、Observableは複数のイベントやデータストリームを扱うことができる点で異なる。また、プロミスは一度解決されるとその後の値の変化には対応できないが、Observableは継続的にデータの更新やイベントの発生を監視し続けることができる。これにより、リアクティブプログラミングのニーズに対してより柔軟に対応できる。フューチャーは、プロミスと似た概念であるが、主に並行処理や並列処理の文脈で使用される。Observableは、これらのモデルと比較して、イベントドリブンな非同期処理に特化している点が特徴である。
Observableの構造
サブスクリプション
Observableの基本構造において、サブスクリプションは重要な要素である[1][6]。サブスクリプションとは、Observableに対してオブザーバーが登録され、データやイベントの通知を受け取るプロセスを指す。オブザーバーは、Observableから発行される値やイベントを受け取り、それに基づいて指定された処理を実行する。サブスクリプションは、Observableのライフサイクルを管理し、必要に応じて購読(サブスクリプション)を解除することでリソースの管理も行う。
オブザーバーパターン
Observableは、オブザーバーパターンに基づいて構築されている[1][2]。このデザインパターンでは、あるオブジェクト(Observable)が状態の変化をもち、その変化を他のオブジェクト(オブザーバー)に通知する。オブザーバーは、Observableにサブスクライブすることで、この通知を受け取ることができる。オブザーバーパターンは、イベント駆動型プログラミングの基本的な仕組みであり、Observableの非同期処理においてもその基盤をなしている。
オペレーター(マップ、フィルター、リダクション等)
Observableの強力な特徴の一つは、データストリームを処理するための様々なオペレーターが提供されている点である[1][6]。マップはデータを変換し、フィルターは特定の条件に合致するデータのみを抽出する。リダクションはデータを集約し、ストリーム全体の要約を生成する。このようなオペレーターを用いることで、データの流れを簡潔に制御し、必要に応じた処理を柔軟に行うことができる。
ストリームとデータフロー
Observableは、データストリームの概念に基づいており、これは連続的に発生するデータやイベントの流れを示している[1][6]。データストリームは、時間の経過に伴って発生するデータの一連の流れであり、Observableはこれを監視し、リアルタイムで処理する。データフローは、これらのデータがオペレーターによってどのように変換され、最終的にどのようにオブザーバーに提供されるかを表している。ストリームとデータフローの概念は、リアクティブプログラミングの核となる部分であり、非同期処理の複雑さをシンプルに表現するための重要な手段である。
Observableの実装
言語別の実装例
Observableは、多くのプログラミング言語で利用可能であり、各言語に応じたライブラリやフレームワークが提供されている。これにより、異なるプラットフォームや開発環境でObservableを用いた非同期処理が実現できる。
Python(RxPY)
RxPYは、PythonでのObservableの実装を提供するライブラリであり、RxJSと同様にリアクティブプログラミングをサポートする[3][4]。Pythonの非同期処理機能(asyncioなど)と組み合わせることで、イベント駆動型のシステムや、非同期データストリームの処理が可能となる。RxPYは、データ処理やリアルタイム分析、複雑なイベント処理など、様々な用途に使用されており、Pythonの柔軟なエコシステムと親和性が高い。
Java(RxJava)
RxJavaは、Java向けのリアクティブプログラミングライブラリであり、Android開発やサーバーサイドアプリケーションの非同期処理に広く用いられている[1][5]。RxJavaは、複雑な非同期処理のフローを簡潔に表現できるため、バックグラウンドスレッドでの処理やユーザーインターフェーススレッドの処理などを効率的に管理できる。また、リアクティブ拡張としての豊富なオペレーターを備えており、データストリームの変換やフィルタリング、エラーハンドリングを柔軟に実装できる。
JavaScript(RxJS)
RxJS(Reactive Extensions for JavaScript)は、JavaScriptでObservableを扱うためのライブラリであり、リアクティブプログラミングを容易にする[6][7]。RxJSでは、Observableを作成し、オペレーターを使用してデータストリームを変換・フィルタリングし、結果をオブザーバーに通知する。非同期イベントの処理や、APIからのデータフェッチ、ユーザーインターフェースの応答処理などに広く利用される。JavaScriptはシングルスレッドで動作するため、RxJSのようなライブラリは非同期処理のパターンを整理し、コードの可読性と保守性を高める役割を果たす。
C#(.NETのObservable)
C#では、.NET Frameworkの一部としてObservableが提供されており、リアクティブプログラミングの基本構成要素となっている[2][8]。.NETのObservableは、LINQ(Language Integrated Query)との親和性が高く、クエリベースでデータストリームを処理することが可能である。また、IObservable<T>インターフェースを通じて、サブスクリプションメカニズムや通知システムが実装されており、データストリームの処理をシンプルに記述できる。特に、非同期APIの設計やリアルタイム処理においてその力を発揮する。
シーケンスと通知メカニズム
Observableの中心には、データやイベントのシーケンスがあり、これらは時間の経過に伴って連続的に発生する[1][6]。Observableは、このシーケンスを監視し、データが発生する度にオブザーバーに通知を送る。この通知メカニズムは、サブスクリプションを通じて実現される。サブスクライブしたオブザーバーは、次々と発生するデータやイベントに応じて処理を実行し、必要に応じて購読(サブスクリプション)を解除することもできる。通知は通常、次の三つの形式を取る:
- 次の値を通知する「onNext」。
- エラーが発生した場合の「onError」。
- シーケンスが正常に完了した場合の「onCompleted」。
メモリ管理とエラー処理
Observableの実装では、メモリ管理とエラー処理が重要な課題となる[1][2]。メモリ管理では、サブスクリプションが不要になった際に適切に解除し、リソースのリークを防ぐことが求められる。多くのObservableライブラリは、サブスクリプションの自動解除機能やガベージコレクションとの統合を提供しており、これによりメモリ管理が簡素化される。また、エラー処理では、データストリーム中に発生するエラーを適切にキャッチし、システム全体がクラッシュしないように処理することが求められる。エラーハンドリングのオペレーター(例:catch、retryなど)を使用することで、エラーが発生した際の動作をカスタマイズし、システムの堅牢性を向上させることが可能である。
応用例
Webアプリケーションにおける利用
Observableは、Webアプリケーションの開発において強力なツールとして活用されている[1][9]。特に、ユーザーインターフェースのイベントハンドリングやリアルタイムデータの表示において重要な役割を果たす。例えば、ユーザーがボタンをクリックしたり、フォームに入力したりする操作に応じて、非同期的にデータを取得し、ページの一部を更新する場合にObservableが利用される。さらに、WebSocketやサーバーからのストリーミングデータを処理し、リアルタイムでのデータ更新や通知を可能にするため、動的で応答性の高いWebアプリケーションの実現に貢献している。
データストリーミングとリアクティブプログラミング
データストリーミングは、連続的に生成されるデータをリアルタイムで処理する技術であり、Observableはこの文脈で広く利用されている[1][2]。例えば、センサーデータのリアルタイムモニタリング[15]、金融市場のリアルタイム価格情報の取得[16]、ソーシャルメディアフィードのライブ更新[17]などにObservableが活用される。リアクティブプログラミングの概念に基づき、データストリームに対してリアクティブ(敏感)に反応し、必要な処理を直ちに実行することができる。このアプローチにより、システムの応答性とスケーラビリティが大幅に向上し、継続的なデータフローを効率的に管理することが可能となる。
マイクロサービスと非同期通信
マイクロサービスアーキテクチャにおいて、非同期通信は重要な設計要素であり、Observableはこれを実現するための手段として利用される[18][19]。マイクロサービス間の通信では、リクエストとレスポンスの非同期処理が求められることが多く、Observableを使用することで、各サービスが独立して動作しつつも効率的に連携することが可能となる。例えば、サービスAがサービスBにリクエストを送り、その応答を待つことなく他の処理を進めることができる。また、サービス間のイベント駆動型のデータ共有においても、Observableはリアルタイムでのデータ転送と処理を容易にする。このように、Observableを活用することで、マイクロサービスの柔軟性とスケーラビリティが向上する。
ゲーム開発における利用
Observableは、ゲーム開発においても重要な役割を果たしている[11][12]。ゲーム内のイベント処理やリアルタイムのユーザーインタラクションの管理、非同期的なゲームロジックの実行など、多岐に渡る用途で利用される。例えば、プレイヤーの操作をリアルタイムで反映させる処理や、ネットワーク通信を介してプレイヤー間で同期を取る処理などにObservableが用いられる。さらに、ゲームの状態管理や、複数の非同期タスクの調整においても、Observableは有効である。これにより、複雑なゲームロジックをシンプルに構築し、プレイヤーに対してスムーズでシームレスな体験を提供することができる。
Observableのメリットと欠点
非同期処理におけるメリット
Observableは、非同期処理を簡潔かつ効率的に扱うための強力なツールである[1][6]。特に、複数の非同期タスクを直列または並列で処理し、その結果を柔軟に処理できる点が大きなメリットである。Observableは、イベント駆動型のプログラム設計を支援し、データストリームに対してリアルタイムに反応することで、ユーザーインターフェースの動的更新やリアルタイムデータ処理を容易にする。また、Observableはオペレーターを駆使してデータを変換・フィルタリングできるため、複雑なデータフローもシンプルに管理できる。これにより、非同期処理に伴うコールバック地獄や状態管理の煩雑さを回避し、コードの可読性と保守性を向上させることができる。
シンプルさと複雑さのトレードオフ
Observableは、その柔軟性と強力な機能を提供する一方で、学習コストの高さや実装の複雑さという課題も伴う[1][7]。Observableの概念やオペレーターの使い方を理解するには、ある程度の学習が必要であり、特に初学者にとっては敷居が高いと感じられることがある。また、複数のオペレーターを組み合わせた複雑なデータフローの設計では、コードの可読性が低下する可能性がある。このため、Observableを利用する際には、シンプルさと複雑さのバランスを取ることが重要であり、適切な設計と実装が求められる。また、Observableのオペレーションが非同期で行われるため、デバッグが困難になることも考慮すべき点である。
スケーラビリティとパフォーマンスの観点から
Observableは、スケーラビリティとパフォーマンスの観点からも優れた選択肢である[1][7]。非同期処理において、Observableは複数のタスクを効率的に管理し、リソースの無駄を最小限に抑えることができる。特に、リアクティブプログラミングのアプローチを取ることで、システム全体のスループットを向上させつつ、レスポンスの迅速化が図れる。また、Observableのストリーム処理は、データの流れをリアルタイムで処理するため、スケーラビリティの高いアプリケーション開発に適している。一方で、Observableの使用には、パフォーマンスへの配慮が必要である。特に、大量のデータをリアルタイムで処理する際には、オペレーターの使用やサブスクリプションの管理が適切でない場合、メモリ使用量の増加や処理遅延が発生する可能性がある。このため、Observableを利用する際には、パフォーマンスチューニングと適切なリソース管理が重要である。
関連技術
プロミスとの比較
Observableとプロミスは、どちらも非同期処理を扱うための技術であるが、その特性と用途は異なる[注釈 1][1][2]。プロミスは、単一の非同期処理の結果を表現し、その結果が解決(fulfilled)されるか、失敗(rejected)するまでの状態を管理する。一度解決されたプロミスは、以降変更されることがなく、複数のイベントや連続したデータストリームを扱うには適していない。一方、Observableは、継続的なデータストリームや複数の非同期イベントを処理するために設計されており、データが発生する度にオブザーバーに通知を送ることができる。また、Observableはオペレーターを使用して、データストリームの変換やフィルタリングを柔軟に行えるため、より複雑な非同期処理を簡潔に管理できる。これにより、プロミスよりも広範な用途に適しているが、その分、学習コストや実装の複雑さが増すという側面もある。
フューチャーとの比較
フューチャーは、プロミスに似た非同期処理の結果をラップするオブジェクトであり、主に並行処理や並列処理の文脈で使用される[注釈 1][14][22]。フューチャーは、非同期タスクの結果を表現し、その結果が利用可能になると、指定された処理を実行する。プロミスと同様に、一度結果が得られると、その後の状態は固定されるため、Observableのように継続的なデータストリームの処理には適していない。フューチャーは、複数の非同期タスクを組み合わせて、一連の処理を構築するためのツールとして有用であるが、リアルタイムデータやイベント駆動型の処理には対応しづらい。一方、Observableは、複数のイベントやデータの変化を連続的に扱うことができるため、リアクティブプログラミングの文脈でより効果的に機能する。
イベントループとリアクター
イベントループとリアクターは、非同期処理を実現するための重要な基盤技術であり、Observableと密接に関連している[2][24]。イベントループは、非同期タスクをキューに追加し、それらを順次処理する仕組みであり、JavaScriptのランタイム環境などで広く使用されている。リアクターは、イベントループをベースにして、イベント駆動型の処理を効率的に管理するデザインパターンであり、非同期I/O処理を効率化するために使用される。Observableは、これらの技術と連携することで、イベント駆動型の非同期処理を簡潔に表現し、複雑なデータフローを管理できる。例えば、JavaScriptではイベントループを利用して、非同期イベントを処理し、RxJSを通じてObservableの機能を実現する。また、リアクターは、非同期処理のスケジューリングと効率的なリソース管理を提供し、Observableを使ったリアクティブプログラミングの実装に役立つ。このように、Observableはイベントループとリアクターの基盤技術を活用し、非同期処理を強化するツールとして機能する。
歴史と発展
Observableの進化と現在の動向
Observableの概念は、オブザーバーパターンを基盤として進化してきた[1][2]。このパターンは、元々オブジェクト指向デザインにおいて、オブジェクト間の疎結合を保ちながら状態の変化を通知するために使用されていた。リアクティブ拡張(英: Reactive Extensions、Rx)の登場により、Observableは非同期データストリームを管理するための中心的な役割を担うようになった。特に、MicrosoftがRxを開発し、.NET Frameworkの一部として導入したことで、Observableの利用が広がった。その後、Python、Java、JavaScriptなど、他の言語にもRxが移植され、リアクティブプログラミングの基本ツールとして定着している。
リアクティブプログラミングの需要が高まる中で、Observableはさらに重要な技術となっている[1][18]。Web開発[9]、モバイルアプリ開発[25]、サーバーサイドの非同期処理[1]など、様々な領域で利用され、リアルタイムでのデータ処理が求められるシステムにおいてその価値を発揮している。さらに、クラウドベースのマイクロサービスアーキテクチャ[18]や、IoTデバイス間のデータ通信[15]においても、Observableはスケーラブルで応答性の高いシステムを構築するための鍵となっている。
リアクティブプログラミングの潮流
リアクティブプログラミングは、システムが動的に変化するデータやイベントに対して即座に反応するプログラミングパラダイムであり、Observableはその中心的な役割を果たしている[1][13]。リアクティブプログラミングの考え方は、リアクティブシステムの設計原則に基づいており、これには応答性、回復性、弾力性、メッセージ駆動性が含まれる。これらの原則は、モダンな分散システムや大規模なアプリケーションにおいて重要視されている。
リアクティブプログラミングの潮流は、データ量が増大し、リアルタイムでの処理が求められる現代のアプリケーション開発においてさらに加速している[26][27]。特に、ストリーミングデータの処理、複雑なイベント処理、ユーザーインターフェースの即時更新など、応答性が求められるシステムにおいては、Observableのようなツールが不可欠である。リアクティブプログラミングは、これまでの命令型プログラミングとは異なり、データの流れやイベントに基づいてシステムが自然に反応することを目指しており、その結果として開発者はより直感的で柔軟なアプリケーションを構築できるようになっている。
Observableの問題と課題
デバッグの難しさ
Observableは非常に強力なツールである一方で、そのデバッグは難しいとされている[1][7]。Observableを使った非同期処理は、連続するデータストリームやイベントの処理が複雑なフローを形成することが多く、エラーの発生源や処理の流れを追跡するのが困難になる場合がある。さらに、Observableの非同期性や、オペレーターによる処理の遅延や結合などが影響し、問題の特定が難しくなることも多い。このため、従来の同期的なデバッグ手法では不十分であり、特別なデバッグツールや手法を必要とすることがある。また、Observableのエラーハンドリングは強力だが、エラーの発生場所やその影響を完全に把握するためには深い理解が必要である。
保守性と学習曲線
Observableを利用したコードは、強力な機能を提供する反面、その保守性に課題を抱えることがある[1][7]。Observableのオペレーターやデータフローが複雑化すると、コードの可読性が低下し、変更や拡張が難しくなる場合がある。また、Observable自体が高度な抽象化を伴うため、新しい開発者や経験の浅い開発者にとっては学習曲線が急峻であると感じられることが多い。リアクティブプログラミングの概念や、Observableの内部動作を深く理解するためには、多くの時間と経験が必要である。このため、チームでのコーディング標準やベストプラクティスを確立し、コードの保守を容易にする工夫が求められる。
マルチスレッドとコンカレンシーとの統合
Observableは、非同期処理のパターンをシンプルに表現できるが、マルチスレッドやコンカレンシーとの統合においては注意が必要である[14][22]。特に、Observableが別々のスレッドで動作する場合、スレッド間のデータ共有や競合状態が発生する可能性があり、これらを適切に管理しなければ予期せぬ動作やパフォーマンスの低下に繋がることがある。また、Observable自体はスレッドセーフではないため、複数のスレッドで同じObservableを利用する際には、外部の同期機構を利用する必要がある。さらに、マルチスレッド環境でのObservableの動作を正しく理解し、適切に設計することが難しいため、コンカレンシーとの統合はObservableの大きな課題の一つである。このため、マルチスレッド環境での使用時には、スレッド管理や同期処理に関する深い知識が求められる。
脚注
注釈
出典
- ^ a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac Nurkiewicz, Tomasz; Christensen, Ben (2016-10-06) (英語). Reactive Programming with RxJava: Creating Asynchronous, Event-Based Applications. "O'Reilly Media, Inc.". ISBN 978-1-4919-3160-8
- ^ a b c d e f g h i j k Liberty, Jesse; Betts, Paul (2012-02-01) (英語). Programming Reactive Extensions and LINQ. Apress. ISBN 978-1-4302-3748-8
- ^ a b Brattli, Dag (2016-11-30) (英語). Python Reactive Programming. Packt Publishing, Limited. ISBN 978-1-78646-344-9
- ^ a b Slatkin, Brett (2015) (英語). Effective Python: 59 Specific Ways to Write Better Python. Addison-Wesley. ISBN 978-0-13-403441-6
- ^ a b Tuominen, Timo (2019-04-17) (英語). RxJava for Android Developers. Simon and Schuster. ISBN 978-1-63835-125-2
- ^ a b c d e f g h i Daniels, Paul; Atencio, Luis (2017-07-20) (英語). RxJS in Action. Simon and Schuster. ISBN 978-1-63835-170-2
- ^ a b c d e f Oliveira, Erich de Souza (2017-05-26) (英語). Mastering Reactive JavaScript. Packt Publishing Ltd. ISBN 978-1-78646-346-3
- ^ a b Terrell, Riccardo (2018) (英語). Concurrency in .NET. Manning Publications
- ^ a b c Bernhardt, Manuel (2016-06-27) (英語). Reactive Web Applications: Covers Play, Akka, and Reactive Streams. Simon and Schuster. ISBN 978-1-63835-339-3
- ^ Richardson, Chris (2018-10-27) (英語). Microservices Patterns: With examples in Java. Simon and Schuster. ISBN 978-1-63835-632-5
- ^ a b Nystrom, Robert (2014-11-03) (英語). Game Programming Patterns. Genever Benning. ISBN 978-0-9905829-1-5
- ^ a b Spell, Terrill Brett (2015-05-29) (英語). Pro Java 8 Programming. Apress. ISBN 978-1-4842-0641-6
- ^ a b Allen, Jamie (2017-02-21) (英語). Reactive Design Patterns. Simon and Schuster. ISBN 978-1-63835-405-5
- ^ a b c Subramaniam, Venkat (2011-08-26) (英語). Programming Concurrency on the JVM: Mastering Synchronization, STM, and Actors. Pragmatic Bookshelf. ISBN 978-1-68050-430-9
- ^ a b Hillar, Gaston C. (2016) (英語). Internet of Things with Python. Packt Publishing. ISBN 978-1-78588-138-1
- ^ Johnson, Barry (2010) (英語). Algorithmic Trading & DMA: An Introduction to Direct Access Trading Strategies. 4Myeloma Press. ISBN 978-0-9563992-0-5
- ^ Russell, Matthew A. (2013-10-04) (英語). Mining the Social Web: Data Mining Facebook, Twitter, LinkedIn, Google+, GitHub, and More. "O'Reilly Media, Inc.". ISBN 978-1-4493-6822-7
- ^ a b c Newman, Sam (2015-02-02) (英語). Building Microservices: Designing Fine-Grained Systems. "O'Reilly Media, Inc.". ISBN 978-1-4919-5033-3
- ^ Bonér, Jonas (英語). Reactive Microservices Architecture: Design Principles for Distributed Systems. O'Reilly Media. ISBN 978-1-4919-5779-0
- ^ Crockford, Douglas (2008-05-08) (英語). JavaScript: The Good Parts: The Good Parts. "O'Reilly Media, Inc.". ISBN 978-0-596-55487-3
- ^ Fowler, Matthew (2022-03-15) (英語). Python Concurrency with asyncio. Simon and Schuster. ISBN 978-1-63835-708-7
- ^ a b c Goetz, Brian (2006) (英語). Java Concurrency in Practice. Addison-Wesley. ISBN 978-0-321-34960-6
- ^ Albahari, Joseph; Albahari, Ben (2015) (英語). C# 6.0 in a Nutshell. O'Reilly
- ^ Casciaro, Mario (2014) (英語). Node.js Design Patterns: Get the Best Out of Node.js by Mastering a Series of Patterns and Techniques to Create Modular, Scalable, and Efficient Applications. Packt Publishing. ISBN 978-1-78328-731-4
- ^ Tsvetinov, Nickolay (2015-06-24) (英語). Learning Reactive Programming with Java 8. Packt Publishing Ltd. ISBN 978-1-78528-250-8
- ^ Escoffier, Clement; Finnigan, Ken (2021-11-10) (英語). Reactive Systems in Java. "O'Reilly Media, Inc.". ISBN 978-1-4920-9169-1
- ^ Escoffier, Clement (2017) (英語). Building Reactive Microservices in Java: Asynchronous and Event-based Application Design. O'Reilly Media
関連項目
- Observable_(プログラミング)のページへのリンク