3

イベント ドリブンと nodejs に関するいくつかの投稿を読んだ後、イベント ドリブンがスレッドのメモリ割り当てを回避し、可能な場合はポーリングを通知に置き換えるという唯一の利点がわかりました。

他の利点はすべて議論の余地があります。

  1. マルチスレッド プログラムは、シングル スレッドよりもミスを犯しやすいです。

    議論: Web アプリケーションの場合、ハンドラー関数に副作用がない限り、リクエストは互いに独立しています。すべての IO 部分がデータベース サーバーによって処理される場合、マルチスレッドについて心配する必要はありません。

  2. イベント ドリブン アプローチは IO でブロックされないため、より多くのリクエストを処理できます。この利点は、イベント駆動型の最も重要な機能のようです。この例では診療所と比較していますが、これは適切ではないと思います。

    主張:診療所の例では、受付係は患者が用紙に記入するのを待たずに、前の患者が用紙に記入している間、他の患者にサービスを提供します。これは誤解を招く例です。

    a. 患者をサーバーにリクエストを送信するクライアントとして解釈する場合。もちろん、サーバーは、クライアントが独自のブラウザーでフォームに入力するのをブロックしません。そして、クライアントがフォームを完成させ、http POST をサーバーに送信すると、サーバーは動作を開始します。Web は、nodejs が存在する前からすでにイベント ドリブン システムでした。したがって、この例は、サーバー側のイベント ドリブン プログラミングを説明するのに有効ではありません。

    b. 患者がフォームに記入することは、サーバー側の IO 集中型操作であると解釈すべきだと言う人もいるでしょう。しかし違いは、患者がフォームに記入するのにお金を払うのではなく、IO 集中型の手術にお金を払うということです。

    だから私の主張は、時間のかかる操作が現在のスレッドをブロックしていなくても、他のスレッド、またはプロセスまたはデータベース サーバーがブロックされているということです。ブロッキングがないため、nodejsが10kの同時接続を提供できることを何度も目にします。時間のかかる部分を処理するのに十分な他のスレッド、プロセス、またはサーバーがなければ、それは不可能だと思います。

この場合、イベント ドリブンは nginx を使用したロード バランシング以外の何物でもありません。ただし、ロード バランシングはアプリケーションへのリクエストをバランスさせますが、イベント ドリブンはリクエストを時間のかかる操作にバランスさせ、ロード バランシング レイヤーを後方に移動します。そうすることの唯一の利点は、この質問の冒頭で述べた 2 つです。1. スレッドのメモリ割り当てを回避します。2. 可能であれば、ポーリングを通知に置き換えます。

ここまで読んでくれてありがとう、私の質問は: 私の理解は正しいですか? 私の議論で間違いはありましたか?

4

1 に答える 1

3

ChaosPandion がコメントで言ったように、スタイルに夢中になっているようです。イベント ベースのプログラミングは、さまざまなトレードオフでプログラムを介してデータ フローを管理するもう 1 つの方法です。一部のアプリケーションでは物事が非常に簡単になりますが、他のアプリケーション (たとえば、CPU 駆動の問題) では特に良くありません。

多くのアプリケーションには、それほど時間のかかる操作はありません。データベースにアクセスする例では、それはアプリケーションが応答 (イベント) を待っているだけです。

イベントベースであることで、スレッド間の通信を管理するプログラミング作業を大幅に節約することもできます。

別の観点については、「同時実行は並列処理ではない」と、Effective Go の同時実行セクションを参照してください。

于 2013-03-23T06:57:47.803 に答える