Googleドライブから複数の大きなファイルを(現在)ダウンロードできる小さな電子プログラムをプログラミングしています。一部のファイルはスキャンするには大きすぎるので、「ダウンロードしてください」ボタンがクリックされたと信じるようにサーバーをトリックします。ファイルのダウンロード中にノードレンダリングプロセスが終了しました
問題は、3,7または12のファイルの後、Chrome Dev Toolsウィンドウに「Render process gone」と表示されるという問題です。
3ファイル: - 同じブロックファイルを3回連続してダウンロードしようとすると、ブロック解除がオンになっています。 4番目のファイルがクラッシュします。
7個のファイル: - ブロックされていないファイル5個とブロックされていないファイル5個が混在しており、ダウンロードのブロックが解除されています。第八ファイルが(非ブロック)要求が
12ファイルクラッシュ: - ダウンロードブロック解除が
のでオフにしながら、9非ブロックされたファイルと3つのブロックされたものをダウンロードし、私は、結論に来たという「ブロック解除」ファイルは12の可能な "スロット"のうちの3つを占めます。それから、すべて(または少なくとも数字)が理にかなっています。
ブロック解除は、同じcookie charと?confirm = xxxxを同じURLに指定して別のリクエストを送信することで機能します。
100MBのテストファイルを持つ別のファイルプロバイダを使用すると、すべてのファイルが12個のファイルの後でクラッシュしないことに注意してください。
正しい方向に向けると非常に役に立ちます。
ここでは、実際に使用されるコードの簡略化されたバージョンを示します。変数宣言や他の多くのものが欠落していることに注意してください、これらの部品が問題なものであるように見える:この質問を投稿している間、私は解決策を見つけたよう
// downloadmanager.js
function DownloadManager(pack) {
var _this = this;
this.downloadpackages = function (package, data, cb) {
sync.fiber(function() {
...
Object.keys(ht_distinct_urls).forEach(function (url) {
localfile = sync.await(_this.download(remotefile, sync.defer()));
console.log("Downloaded:" + localfile);
});
});
}
this.dl = function (remotefile, cb) {
request(request_options, (err, response, body) => {
// cb() in this location makes it crash at the 13th file
cb(null, "");
});
// cb() in this location doesnt make it crash (but also not download anything)
//cb(null, "");
}
this.download = function (remotefile, cb) {
// Try to download
_this.dl(remotefile, function (err, data) {
if (data.downloaded) { // It worked
cb(err, data);
} else if (data.unblocked) { // It was able to get a code to unblock it
_this.dl(data, cb); // Try again with the new cookie and the code
} else {
// Fck it, just return the data anyway for debugging
cb(err, data);
}
});
};
}
// renderer.js
sync.fiber(function() {
var pack = getPackage();
var dm = new DownloadManager(pack);
var download_result = sync.await(dm.downloadpackages(pack, ht_distinct_urls, sync.defer()));
console.log(download_result);
});
これについては、何が起こっているのかについての手掛かりがあるかもしれません。場合によっては、メインのJSスレッドに "息を止めさせる"ようにする必要があります。 'setTimeout'を使うことで、関数を効果的に*延期します。たぶん 'setTimeout(...、0)'で十分でしょう。試してみてください。この '0'を心配しないで、ブラウザは最小値(通常は10msですが、私の情報は最新ではないかもしれません)にキャップします。 – Watilin