タグ付けされた質問 「asynchronous-programming」

1
コールバックとPromiseの間に根本的な違いは本当にありますか?
シングルスレッドの非同期プログラミングを行うとき、私がよく知っている2つの主なテクニックがあります。最も一般的なのは、コールバックを使用することです。つまり、コールバック関数をパラメーターとして非同期に動作する関数に渡すことを意味します。非同期操作が終了すると、コールバックが呼び出されます。 jQueryこのように設計されたいくつかの典型的なコード: $.get('userDetails', {'name': 'joe'}, function(data) { $('#userAge').text(data.age); }); ただし、このタイプのコードは、前のコードが終了したときに追加の非同期呼び出しを次々に行いたい場合、面倒で高度にネストされる可能性があります。 2番目のアプローチはPromiseを使用することです。Promiseは、まだ存在しない可能性のある値を表すオブジェクトです。値にコールバックを設定できます。コールバックは、値を読み取る準備ができたときに呼び出されます。 Promiseと従来のコールバックアプローチの違いは、非同期メソッドがクライアントがコールバックを設定するPromiseオブジェクトを同期的に返すようになったことです。たとえば、AngularJSでPromiseを使用した同様のコード: $http.get('userDetails', {'name': 'joe'}) .then(function(response) { $('#userAge').text(response.age); }); だから私の質問は次のとおりです。実際に本当の違いはありますか?違いは純粋に構文上のようです。 ある技術を他の技術よりも使用する深い理由はありますか?


13
プログラミング言語が同期/非同期の問題を自動的に管理しないのはなぜですか?
私はこれについて多くのリソースを見つけていません:非同期のコードを同期的な方法で書くことができるのか、それとも良い考えかと思っていました。 たとえば、データベースに保存されているユーザーの数を取得するJavaScriptコードを次に示します(非同期操作)。 getNbOfUsers(function (nbOfUsers) { console.log(nbOfUsers) }); 次のようなものを書くことができたらうれしいです: const nbOfUsers = getNbOfUsers(); console.log(getNbOfUsers); そのため、コンパイラは自動的に応答を待機してから実行しconsole.logます。結果を他の場所で使用する前に、非同期操作が完了するまで常に待機します。コールバックpromise、async / awaitなどを使用することはあまりなく、操作の結果がすぐに利用可能かどうかを心配する必要はありません。 nbOfUserstry / catch、またはSwift言語のようなオプションのようなものを使用して、エラーを管理できます(整数またはエラーを取得しましたか?)。 出来ますか?それはひどいアイデア/ユートピアかもしれません...私は知りません。

4
どのJavascript関数がブロックと非ブロックを決定するのですか?
数年前からWebベースのJavascript(バニラJS、jQuery、Backboneなど)をやっていて、最近Node.jsでいくつかの仕事をしています。「ノンブロッキング」プログラミングのコツをつかむにはしばらく時間がかかりましたが、今ではIO操作などにコールバックを使用することに慣れています。 Javascriptは本質的にシングルスレッドであることを理解しています。Nodeの「イベントキュー」の概念を理解しています。私が理解できないのは、個々のjavascript操作が「ブロッキング」か「ノンブロッキング」かを決定するものです。後のコードで使用するために出力を同期的に生成するために依存できる操作、および最初の操作が完了した後に出力を処理できるようにコールバックを渡す必要がある操作を確認するにはどうすればよいですか?非同期/非ブロッキングのJavascript関数のリストと、同期/ブロッキングの関数のリストはありますか?Javascriptアプリが1つの巨大な競合状態になるのを妨げているのは何ですか? NodeでのIO操作やWebでのAJAX操作など、時間がかかる操作は非同期である必要があるため、コールバックを使用することを知っていますが、「長時間」と見なされるものを決定しているのは誰ですか?これらの操作には、通常の「イベントキュー」からそれらを削除する何らかのトリガーがありますか?そうでない場合、変数への値の割り当てや配列のループなどの単純な操作と、それらを同期方式で終了することに依存できると思われるものとは何が違うのでしょうか? おそらく、私はこれを正しく考えさえしていないでしょう。ありがとう!

2
コールバックを使用すると、Javascriptコードはどのように非同期になりますか?
非同期のJavaScriptコードの書き方を見つけようとして、私はオンラインで多くの本を読んでいます。私の研究でよく出てきたテクニックの1つは、コールバックを使用することです。コールバック関数を作成して実行する方法のプロセスは理解していますが、コールバックがJavaScriptの実行を自動的に非同期にするのはなぜかと混乱しています。したがって、私の質問は、コールバック関数をJavaScriptコードに追加すると、コードが自動的に非同期になるのですか?

4
async + await == sync?
非同期Web要求の作成について説明しているこの投稿を見つけました。 さて、単純さはさておき、現実の世界であなたがすることは非同期リクエストを作成して次の行でそれを待つことだけです、そもそも同期呼び出しをするのと同じではないでしょうか?

1
非同期プログラミングの学習[終了]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 非同期のノンブロッキングイベント駆動プログラミングが大流行しているようです。これが何を意味するのか、基本的な概念を理解しています。しかし、私が確信していないのは、コードが非同期であることのメリットとなるタイミングと場所、またはブロッキングIOを非ブロッキングにする方法です。ライブラリを使用してこれを行うことができると確信していますが、より深い概念と、それを自分で実装するさまざまな方法にもっと興味があります。 このテーマに関する包括的な/決定的な書籍、または他のリソース(デザインパターンのGoF、CのK&R、bashなどのtldpなど)はありますか? (注:イベント駆動プログラミングの学習に関する私の質問と実際に機能的に同じ質問であるかどうかはわかりません)

2
誰が最初に非同期/待機しましたか?
Pythonは、2015年に3.5でasync / awaitコンストラクトを追加しました。Javascriptコミュニティは、数千年にわたってそれに向かって一歩を踏み出し、最終的に2017年にリリースされたES8のドラフトに非常によく似た実装を追加しました(私の理解から)。Typescriptは、2015年にバージョン1.7の非同期メソッドを追加しました。これは、訓練されていない目にはjs非同期メソッドとまったく同じように見えます。 C#2012年にasync / awaitの他のすべての実装のように見える非同期メソッドを追加し、2010年にF#2.0で導入されたF#の同様に動作するが外観の異なる非同期ワークフローに基づいていました。 -非同期/待機ペアを持つC#および非同期フローを持つF#。 言語コンストラクト(またはライブラリ)としてこのコンテキストで使用されているキーワードの以前の例はありますか?私の限られた情報から、誰もがC#実装の良い部分を模倣したように見えますが、C#は他の誰かからそれをコピーしましたか?

1
AkkaはJMS / AMQPメッセージブローカーを廃止しますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 先週、Akkaのドキュメントを深く掘り下げ、最終的にアクターシステムとは何か、そしてそれらが解決する問題を理解しました。 私の従来のJMS / AMQPメッセージブローカーの理解(および経験)は、以下を提供するために存在するということです。 プロデューサーとコンシューマー間の非同期処理。そして 持続性、再試行、フォールバックを含むメッセージ配信の保証 しかし、Akkaはこれを提供し、必要なインフラストラクチャと運用オーバーヘッドをすべて排除しませんか? Akkaでは、すべてのアクター通信は非同期で非ブロッキングです。そして Akkaでは、SupervisorStrategies再試行、フォールバック、およびエスカレーションを達成するために存在します。これも要件である場合、実質的にあらゆるタイプのストアに持続するようにアクターを構成できます。 私のアプリがAkkaを使用している場合、JMS / AMQPブローカー(ActiveMQ、RabbitMQ、Kafkaなど)を写真に取り入れる必要がありますか?つまり、新しいAkkaベースのアプリが新しい JMS / AMQPブローカークラスターの導入を保証するユースケースはありますか?なぜですか? 唯一の議論は、おそらく私のAkkaアプリを別のシステムと統合する必要があるということです。ただし、その場合、Akka-Camelモジュールを使用すると、AkkaはCamelの統合機能の網羅的でほぼ無限のリスト(TCP、FTP、ZeroMQ、リストは延々と続く...)を活用できます。 考え?

3
複数の非同期サービスを並行して呼び出す
互いに依存しない非同期RESTサービスはほとんどありません。それは、Service1からの応答を「待っている」間で、Service2、Service3などを呼び出すことができます。 たとえば、以下のコードを参照してください。 var service1Response = await HttpService1Async(); var service2Response = await HttpService2Async(); // Use service1Response and service2Response 現在、にservice2Response依存せず、service1Response独立して取得できます。したがって、最初のサービスの応答を待って2番目のサービスを呼び出す必要はありません。 Parallel.ForEachCPUバウンド操作ではないため、ここで使用できるとは思わない。 これらの2つの操作を並行して呼び出すために、useを呼び出すことができますTask.WhenAllか?私が使用してTask.WhenAllいる問題の1つは、結果を返さないことです。結果を取得するには、を呼び出したtask.Result後に呼び出すことができます。Task.WhenAllすべてのタスクが既に完了しており、応答を取得する必要があるためです。 サンプルコード: var task1 = HttpService1Async(); var task2 = HttpService2Async(); await Task.WhenAll(task1, task2) var result1 = task1.Result; var result2 = task2.Result; // Use result1 and result2 このコードは、パフォーマンスの面で最初のコードよりも優れていますか?私が使用できる他のアプローチはありますか?

3
API Gateway(REST)+イベント駆動型マイクロサービス
API Gatewayパターンに従ってREST APIを介して機能を公開するマイクロサービスがたくさんあります。これらのマイクロサービスはSpring Bootアプリケーションなので、Spring AMQPを使用して、これらのマイクロサービス間でRPCスタイルの同期通信を実現しています。これまでのところ物事は順調に進んでいます。ただし、イベント駆動型のマイクロサービスアーキテクチャについて詳しく読んで、Spring Cloud Streamなどのプロジェクトを見ると、RPC同期アプローチで間違った方法で物事をしている可能性があると確信するようになります(特に、これをスケーリングする必要があるため)クライアントアプリケーションからの1秒あたり数百または数千のリクエストに応答するため)。 イベント駆動型アーキテクチャの背後にあるポイントを理解しています。私がよく理解していないのは、すべての要求に対する応答を期待するモデル(REST)の後ろに座っているときに、そのようなパターンを実際に使用する方法です。たとえば、APIゲートウェイをマイクロサービスとして使用し、ユーザーを保存および管理する別のマイクロサービスがあるGET /users/1場合、純粋にイベント駆動型のようにモデル化するにはどうすればよいですか?

1
NodeJSはどのようにして「ノンブロッキング」にできますか?
私はNodeJSを学んでおり、何かを明確にしたかっただけです。これまでのいくつかの入門チュートリアルと本では、非常に早い段階でNodeの「ノンブロッキング」アーキテクチャについて説明しました。 したがって、たとえば、この例は、データベースからデータを取得する非同期的な方法を読んでいる本で提供されました。 http.createServer(function (req, res) { database.getInformation(function (data) { res.writeHead(200); res.end(data); }); }); (私が理解しているように)起こることは、Nodeがデータベースへの呼び出しを行い、次に呼び出しスタックの次のものを処理し続けることです。データベースリクエストが完了すると、匿名コールバック関数のデータ変数が設定され、その関数がコールスタックに追加されます(その後、ノードがそれに到達したときに実行されます)。 私の質問は、データベース要求を正確に処理しているのは何ですか?確かにNodeはブロックしなければなりませんか?データベース要求を処理しているのは何ですか?または、Nodeが外部リソースへの非同期HTTP GETリクエストを待機している場合、Nodeがコールスタックの処理を継続して「非ブロッキング」になることを可能にするリクエストを処理しているのは何ですか?

2
単一のメソッド内で同期メソッドと非同期メソッドを効率的に混合しますか?
さて、奇妙に聞こえますが、コードは非常にシンプルで、状況をうまく説明しています。 public virtual async Task RemoveFromRoleAsync(AzureTableUser user, string role) { AssertNotDisposed(); var roles = await GetRolesForUser(user); roles.Roles = RemoveRoles(roles.Roles, role); await Run(TableOperation.Replace(roles)); } (私は以下の要約で話していることを知っていますが、上記は私がここで尋ねていることを実際に実行している実際の生産コードになるものからの実際の方法であり、実際にレビューすることに興味があります非同期/待機パターンに対する正確さのため) async/ を使用しているため、このパターンに頻繁に遭遇していawaitます。このパターンは、次の一連のイベントで構成されています。 作業に必要な情報を取得する最初の電話を待つ その情報を同期的に処理する 更新された作業を保存する最後の呼び出しを待つ 通常、上記のコードブロックは、これらのメソッドの処理方法です。私awaitは最初の呼び出しです。非同期であるためです。次に、IOまたはリソースにバインドされていないため、非同期ではない、必要な作業を実行します。最後に、私はまた、ある私の仕事、保存async、および貨物カルトIのうち呼び出しawait、それを。 しかし、これはこのパターンを処理する最も効率的で正しい方法ですか?私awaitは最後の呼び出しをスキップすることができたようですが、それが失敗したらどうなりますか?また、同期作業を元の呼び出しと連鎖さTaskせるなどの方法を使用する必要がありContinueWithますか?私はちょうど今これを正しく処理しているかどうかわからない時点にいます。 例のコードを考えると、この非同期/同期/非同期メソッド呼び出しチェーンを処理するより良い方法はありますか?

1
C#5.0の非同期関数と通常の関数の間の線をぼかす
最近、C#5.0の驚くべき非同期待機パターンを十分に理解できていないようです。あなたは私の人生のどこにいましたか? 単純な構文には本当に感激していますが、小さな難しさがあります。私の問題は、非同期関数の宣言が通常の関数とはまったく異なるということです。他の非同期関数で待機できるのは非同期関数だけなので、古いブロックコードを非同期に移植しようとすると、変換しなければならない関数のドミノ効果があります。 人々はこれをゾンビの蔓延と呼んでいます。asyncがコードに噛み付くと、ますます大きくなります。移植プロセスは難しくありません。async宣言をスローし、戻り値をでラップするだけTask<>です。しかし、古い同期コードを移植するときに、これを何度も繰り返すのは面倒です。 両方の関数タイプ(asyncとplain old sync)がまったく同じ構文を持っていると、はるかに自然に思えます。これが事実であった場合、移植はゼロの労力で済み、2つの形式を簡単に切り替えることができます。 私はこれらのルールに従えばこれはうまくいくと思います: 非同期関数はasync宣言を必要としなくなります。それらの戻り値の型をにラップする必要はありませんTask<>。コンパイラは、コンパイル時に非同期関数を単独で識別し、必要に応じてTask <>ラッピングを自動的に実行します。 非同期関数の呼び出しを忘れることはありません。非同期関数を呼び出したい場合は、それを待つ必要があります。私はとにかくファイアアンドフォーゲットをほとんど使用していません。クレイジーレースコンディションやデッドロックのすべての例は、常にそれらに基づいているようです。私はそれらが私たちが活用しようとしている同期の考え方とあまりに混乱していて「連絡がない」と思います。 本当に忘れずに生きられないのなら、それのための特別な構文があります。いずれにせよ、それは私が話している単純な統一構文の一部にはなりません。 非同期呼び出しを示す必要がある唯一のキーワードはawaitです。待機している場合、呼び出しは非同期です。そうでない場合、呼び出しは従来の同期になります(覚えておく必要はありません)。 コンパイラーは非同期関数を自動的に識別します(関数には特別な宣言がなくなるため)。ルール4では、これを非常に簡単に行うawaitことができます。関数の内部に呼び出しがある場合、関数は非同期です。 これでうまくいきますか?または私は何かを逃していますか?この統一された構文ははるかに流動的で、ゾンビの蔓延を完全に解決できます。 いくつかの例: // assume this is an async function (has await calls inside) int CalcRemoteBalanceAsync() { ... } // assume this is a regular sync function (has no await calls inside) int CalcRemoteBalance() { ... } // …

1
非同期タスクが悪いUXを作るとき
私は、必死にそれを必要とするIDEを拡張するCOMアドインを書いています。関係する機能はたくさんありますが、この投稿のために2つに絞ってみましょう。 ユーザーがモジュールとそのメンバーをナビゲートできるツリービューを表示するコードエクスプローラーツールウィンドウがあります。 ユーザーがコードの問題をナビゲートして自動的に修正できるようにするdatagridviewを表示するコードインスペクションツールウィンドウがあります。 どちらのツールにも、開いているすべてのプロジェクトのすべてのコードを解析する非同期タスクを開始する「更新」ボタンがあります。コードエクスプローラは、構築するために、解析結果を使用してツリービューをし、コード検査は、コードの問題を発見し、その中で結果を表示する解析結果を使用するDataGridView。 ここで私がやろうとしているのは、機能間で解析結果を共有することです。これにより、コードエクスプローラーが更新されたときに、コードインスペクションがそれを認識し、コードエクスプローラーが行った解析作業をやり直すことなく更新できるようになります。。 それで私がやったことは、パーサークラスを、機能が登録できるイベントプロバイダーにしたことです。 private void _parser_ParseCompleted(object sender, ParseCompletedEventArgs e) { Control.Invoke((MethodInvoker) delegate { Control.SolutionTree.Nodes.Clear(); foreach (var result in e.ParseResults) { var node = new TreeNode(result.Project.Name); node.ImageKey = "Hourglass"; node.SelectedImageKey = node.ImageKey; AddProjectNodes(result, node); Control.SolutionTree.Nodes.Add(node); } Control.EnableRefresh(); }); } private void _parser_ParseStarted(object sender, ParseStartedEventArgs e) { Control.Invoke((MethodInvoker) delegate …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.