Firefox扩展中的并发和多线程

pli*_*lin 3 firefox firefox-addon firefox-addon-sdk

我正在使用Add-on构建器和Add-on SDK编写Firefox扩展.到目前为止,我已经能够解决任何限制,而无需转向XUL.但是,我遇到了障碍.

我的扩展有一个长时间运行的进程,可能会阻塞,所以我需要将此处理与主UI线程分开.我在这里读过这个问题,但它并没有完全回答我的问题.Web Workers是不够的,因为长时间运行的进程需要访问js-ctypes和本机代码.因此,似乎ChromeWorker可能会做到这一点.但是,我不知道如何从Add-on构建器访问它.此外,线程管理器只能通过C++代码访问.我怎么能:

  1. 访问并实例化Chrome Workers(或)
  2. 创建线程(或)
  3. 假并发(不知何故)

避免阻止UI线程.或者,我可以使用本机代码(我正在努力避免).

Wla*_*ant 6

您应该使用chrome worker,它们专门用于在不同的线程上使用js-ctypes.线程管理器存在问题,并且由于某种原因不允许使用JavaScript.但是,主要问题是ChromeWorker构造函数未在Add-on SDK模块中公开.但你可以从chrome伪模块中获取它:

var self = require("sdk/self");
var {ChromeWorker} = require("chrome");
var worker = new ChromeWorker(self.data.url("worker.js"));
Run Code Online (Sandbox Code Playgroud)

这仅适用于Firefox 8,在早期版本中您将使用工作厂.但我想你不需要 - 无论如何,新的附加SDK版本不支持Firefox 9以下的任何版本.

注意:如果禁用或卸载了加载项(例如使用unload模块),则应确保关闭此工作程序,这不会自动发生.

编辑:Matthew Ruttley在他的详细博客文章中描述了一种更简单的导入chrome worker的方法,我相应地更新了这个答案.