CPU を集中的に使用する JavaScript アプリケーションを作成しています。CPU を集中的に使用する計算が発生しているときに UI がロックされることがあるという問題が発生しています。これを解決するための標準的なアプローチは、UI イベントを呼び出しsetTimeout
てイベント ループに応答させることです。しかし、それは私にはうまくいきません。その理由は次のとおりです。
ページが読み込まれると、javascript vm は大量のデータの解析と分析を行う必要があります。これは本当にバックグラウンド的なもので、setTimeout
各チャンクを実行するために呼び出しています。ただし、これは、すべてのチャンクが完了するまで (大きなファイルの場合は最大 10 秒かかる場合があります)、保存するたびに、非常に途切れ途切れの UI エクスペリエンスがユーザーに表示されることを意味します。これは受け入れられません。
私は2つの解決策を考えることができますが、どちらもあまり好きではありません:
- チャンクをより細かくすることで、イベント ループが実行される機会が増えます。しかし、CPU コードがすでに非常に複雑であるため、私はこれが好きではありませんが、通常はうまく動作します。CPUバウンドコード全体で呼び出す
setTimeout
と、はるかに複雑になります - サーバーでより多くの作業を行います。ただし、ノードサーバーを実行していると、クライアントからサーバーに問題が単純にプッシュされ、帯域幅が増加するという問題が追加されます。
これを修正することは、従来のスレッドベースの VM では簡単です。Javascript はどうすればいいですか?
アップデート:
私が言及するのを忘れたいくつかのポイント:
- 従来のブラウザーには関心がなく、すべてのユーザーは最新の Firefox、Chrome、Opera、Safari、IE などを使用する必要があります。
- 最初のプロトタイプでは、クライアントとサーバーが同じ場所に配置されていますが、リモート サーバーへの移行を妨げるものは何もないはずです。
- データはクライアント上に存在します (クライアントとサーバーが同じマシンである場合は当然ですが、これはリモート サーバーに移動した場合でも当てはまります)。
Webworker は解決策かもしれませんが、それでも不安定に見えます。誰もそれらを経験したことがありますか?それらは安定していますか?それらを十分にサポートしていない最新のブラウザーはどれですか? それらに一般的な問題はありますか?