私はこのアプローチを使用して、特定のリクエストがグローバル配列を操作するhttpサーバーをホストするグローバル配列にデータを格納しています。
push
特定の操作(主にと)でスレッドの問題が発生するのではないかと心配していsplice
ます。あるリクエストで配列を反復処理し、条件に基づいてアイテムを削除し、別のリクエストで.push()
問題が発生する配列を呼び出す場合を想像します。誰かがこれを確認できますか?
私は主にC#で記述しますが、単純な増分でもスレッドセーフではありません(i ++を実行する25のスレッドを起動しても、結局のところi == 25であるとは保証されません)。
更新:
私が話していることを示すために、5つの例を書きました。テスト1とテスト3は正常に機能します。テスト2は失敗します。これは、通常はスレッドの問題と呼ばれるもの(実際のCPUスレッドであるかどうかに関係なく)が原因です。テスト4と5は、並行して実行すると機能するように見えます(つまり、テスト2のような衝突の問題はありません)。
私はApacheBenchを使用してテストし、1000の並列リクエストを行っています。
これにより、nodejsは並列javascript関数でコールバックの複数のインスタンスを並列に実行しないため(ブロッキング?)、テスト1とテスト3は正常に機能すると思います。setInterval / setTimeoutを実装するとすぐに、nodejsが解放され、コールバックの別のインスタンスが実行されます(ノンブロッキング?)。app.get('/test3'...)
私は本当に一体何をnon-blocking I/O model
意味するのかを理解しようとしています。「ノンブロッキングが必要な場合は、setTimeoutとsetIntervalを使用してノンブロッキングを実行できます。そうしないと、実行中の関数がなくなるまで、他の外部レベルの関数の実行がブロックされます」という意味ですか。 ?/ test2のようなものを実装して完全に安全だと思って困らないように、これを知ることが不可欠だと感じています。
また、コールバックでブロックしないようにしようとしている場合、本当に呼び出す必要がありsetTimeout(code, 1)
ますか?それとももっと良い方法はありますか?