タイトルは他の12の質問の重複のように聞こえることを私は知っています、そしてそれはおそらくそうかもしれません。しかし、私はそれらの12の質問を読み、しばらくの間グーグルで検索しましたが、これらの質問に満足のいく答えを与えるものは何も見つかりませんでした。
これは、誰も適切に回答していないことが原因である可能性があります。その場合は、私に投票してください。
これは、私が愚かで、他の答えを理解していなかったためである可能性があります(はるかに可能性が高い)。その場合は、私を投票する必要があります。
コンテクスト:
Node.jsのIO操作が検出され、デフォルトで非同期で実行されることを知っています。私の質問は、まだ長期間ブロック/実行される可能性のある非IO操作についてです。
blockingfunction
加算などを行うfor
ループ(純粋なCPUサイクル、IOなし)を備えた関数があり、その多くが含まれているとします。実行には1分以上かかります。
誰かが私のサーバーに特定の要求をするたびにこの関数を実行したいとします。
質問:
明らかに、コードの外部レベルでこのループを明示的に呼び出すと、完了するまですべてがブロックされます。
私が読んだほとんどの提案は、他のすべてのハンドラー/サーバーなどを最初に起動し、process.nextTick
またはを介して関数の呼び出しを延期することによって、将来に向けて推進することを提案していますsetTimeout(blockingfunction, 0)
。
しかし
blockingfunction1
、実行ループの周りの次のスピンでブロックするだけではありませんか?私は間違っているかもしれませんが、そうすることでアプリをブロックせずに他のすべてのものを開始するようですが、誰かが最初にリクエストを行っblockingfunction
て呼び出されると、完了するまでにすべてがブロックされます。blockingfunction
asetTimeout
またはcallを中に入れるprocess.nextTick
と、将来の操作をブロックすることなく共存させることができますか?blockingfunction
そうでない場合は、書き直さずにそれを行う方法はありますか?他の人はこの問題をどのように処理しますか?私が見た答えの多くは、「CPUを集中的に使用するものを高速であると信じてください。そうなるでしょう」という曲に対するものですが、これでは満足できません。
スレッドがない場合(
blockingfunction
の実行が他の処理の実行とインターリーブされることが保証される場合)、CPUを集中的に使用し、時間のかかるループを書き直しprocess.nextTick
て、固定された高速の保証された数のループを実行する必要があります。ティックごとの反復?