从主线程运行代码?

时间:2014-06-21 04:16:29

标签: javascript asynchronous firefox-addon synchronous

我知道可以从主线程运行js-ctypes,因此使用ChromeWorker进行异步操作。但是ChromeWorker s不能使用XPCOM。

所以我想知道是否有办法从主线程中运行其他同步东西?

我希望将它用于nsIZipWriter,nsIToolkitProfileService :: Lock / Unlock`等内容。

2 个答案:

答案 0 :(得分:2)

在Javascript中,运行非主线程代码的唯一方法是WebWorker / ChromeWorker,它确实没有XPCOM访问权限。

实际上,曾经有一种方法可以让工人使用XPCOM,而且我最初在被删除时感到很沮丧,但现在我明白这是正确的做法:很多(大多数?)XPCOM不是线程安全,甚至在使用似乎是XPCOM类的自包含实例时,因为最终许多事情最终会调用一些非线程安全的服务作为其实现的一部分。这会导致数据和/或内存损坏,并最终导致崩溃和数据丢失。这里的问题是它并不总是破坏内存,因为并不总是存在数据竞争,而是每次运行代码时只会造成严重破坏。人们经常习惯于开发和测试他们的东西,它碰巧工作或者至少看起来像是有效的,但是一旦人们(也就是用户)开始执行代码,崩溃就开始堆积起来。

可以在C ++代码中运行代码离开主线程,但是它有同样的问题,很多XPCOM都不是线程安全的,所以你需要谨慎对待你运行的一个不同的线程,即只访问明确标记为线程安全的东西,但即使有这样的标记,也可能存在线程安全漏洞。

因此,您不能在JS的另一个线程中使用XPCOM(除非有专门的组件为您执行此操作,如nsIAsyncStreamCopier),甚至在C ++的另一个线程中运行XPCOM需要大量的知识,技能和时间如果碰到崩溃就调试一下。

如果你真的想要,那么像拉链编写器这样的东西可以在JS中相当容易地实现并在Worker中运行。例如。 zip格式并不是特别难以实现,特别是如果你不需要实际的压缩,OS.File允许你大多方便地从工作者那里做文件I / O.

答案 1 :(得分:1)

我认为您可以以异步方式运行同步内容。

请参阅:https://developer.mozilla.org/en-US/Add-ons/Code_snippets/Threads