1

タイトルは他の12の質問の重複のように聞こえることを私は知っています、そしてそれはおそらくそうかもしれません。しかし、私はそれらの12の質問を読み、しばらくの間グーグルで検索しましたが、これらの質問に満足のいく答えを与えるものは何も見つかりませんでした。

これは、誰も適切に回答していないことが原因である可能性があります。その場合は、私に投票してください。

これは、私が愚かで、他の答えを理解していなかったためである可能性があります(はるかに可能性が高い)。その場合は、私を投票する必要があります。

コンテクスト:

Node.jsのIO操作が検出され、デフォルトで非同期で実行されることを知っています。私の質問は、まだ長期間ブロック/実行される可能性のある非IO操作についてです。

blockingfunction加算などを行うforループ(純粋なCPUサイクル、IOなし)を備えた関数があり、その多くが含まれているとします。実行には1分以上かかります。

誰かが私のサーバーに特定の要求をするたびにこの関数を実行したいとします。

質問:

明らかに、コードの外部レベルでこのループを明示的に呼び出すと、完了するまですべてがブロックされます。

私が読んだほとんどの提案は、他のすべてのハンドラー/サーバーなどを最初に起動し、process.nextTickまたはを介して関数の呼び出しを延期することによって、将来に向けて推進することを提案していますsetTimeout(blockingfunction, 0)

  • しかしblockingfunction1、実行ループの周りの次のスピンでブロックするだけではありませんか?私は間違っているかもしれませんが、そうすることでアプリをブロックせずに他のすべてのものを開始するようですが、誰かが最初にリクエストを行っblockingfunctionて呼び出されると、完了するまでにすべてがブロックされます。

  • blockingfunctionasetTimeoutまたはcallを中に入れるprocess.nextTickと、将来の操作をブロックすることなく共存させることができますか?

  • blockingfunctionそうでない場合は、書き直さずにそれを行う方法はありますか?

  • 他の人はこの問題をどのように処理しますか?私が見た答えの多くは、「CPUを集中的に使用するものを高速であると信じてください。そうなるでしょう」という曲に対するものですが、これでは満足できません。

  • スレッドがない場合(blockingfunctionの実行が他の処理の実行とインターリーブされることが保証される場合)、CPUを集中的に使用し、時間のかかるループを書き直しprocess.nextTickて、固定された高速の保証された数のループを実行する必要があります。ティックごとの反復?

4

2 に答える 2

2

はい。それで合っています。関数を次のティックまで延期すると、現在のティックではなく、そのティックでブロックされます。

残念ながら、これを解決する魔法はここにはありません。別のプロセスでその関数を起動することは可能ですが、実行していることによっては、面倒な価値がない場合があります。

少しの間作業が行われ、次のティックに進むように関数を書き直すことをお勧めします。ノードティックは非常に効率的です...必要に応じて、大量のオーバーヘッドなしで、適​​切なサイズのループの反復ごとに呼び出すことができます。もちろん、影響を確認するには、コードでプロファイルを作成する必要があります。

于 2012-08-05T16:24:01.200 に答える
2

はい、ブロック関数は、process.nextTickを実行してもブロックを継続します。

いくつかのオプション:

  1. 本当に時間がかかる場合は、専用のワーカープロセスに処理させることができるキューにスピンアウトする必要があります。

    1a。Node.jsには、通信チャネルが組み込まれた他のnode.jsファイルをフォークするための子プロセスフレーバーがあります。たとえば、これらのリクエストを順番に処理する1つ(または複数)のスレッドを作成し、応答してコールバックをヒットすることができます。参照: http: //nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options

  2. blockingFunctionをループで実行されるチャンクに分割できます。他のイベントが処理されるように、process.nextTickを使用してX回の反復ごとに呼び出すようにします。

于 2012-12-20T22:36:00.837 に答える