当一个页面在插件脚本中加载页面工作者时,我在后台抓取大约20个网站。不幸的是,浏览器冻结,在此期间无法预测。
我尝试使用timers.setTimeout(...,0-400ms)并尝试了wiki中的示例
function executeSoon(aFunc) {
var tm = Cc["@mozilla.org/thread-manager;1"]
.getService(Ci.nsIThreadManager);
tm.mainThread.dispatch({
run: function () {
aFunc();
}
}, Ci.nsIThread.DISPATCH_NORMAL);
}
但这也会冻结用户界面。还有其他解决方案吗?
抓取代码:
...
timer.setTimeout(function () {
let pageWorker = require("sdk/page-worker").Page({
contentScriptFile: self.data.url("js/extractor.js"),
contentURL: url
});
pageWorker.port.on("loaded", function (content) {
if (typeof callback === 'function') {
callback(content);
}
});
}, 200)
...
即使在更简单的情况下,它返回body.textContent的extractor.js也是阻塞的。
答案 0 :(得分:0)
页面工作者API只是创建一个不可见的页面,它不会在后台线程上这样做,因为它必须创建一个完整的窗口/文档环境,包括允许完整的dom /样式功能的布局,并且布局总是发生在主线。
如果您想在后台进行计算,则应使用Worker或ChromeWorker API,在这些API中您无法访问DOM和许多其他API。
在SDK中,您可以使用
const { ChromeWorker } = require("chrome");
答案 1 :(得分:0)
这是因为Firefox使用主要线程用于页面工作者,在Firefox中,每晚内容页面使用单独的进程,这意味着页面工作者也将使用单独的进程,因此请尝试Firefox Nightly,它应该在那里工作,这将在几个月后发布。