我知道可以js-ctypes
在主线程之外运行,因此可以通过使用来执行异步操作ChromeWorker
。但ChromeWorker
不能使用XPCOM。
所以我想知道是否有办法在主线程上运行其他同步内容?
我希望将其用于nsIZipWriter
nsIToolkitProfileService :: Lock / Unlock`等。
在Javascript中,运行主线程代码的唯一方法是WebWorker
/ ChromeWorker
,它实际上没有XPCOM访问权限。
实际上,过去曾经有一种从工作人员使用XPCOM的方法,当它再次被删除时,我最初很不高兴,但是现在我意识到这是正确的做法:XPCOM的很多(大多数?)不是线程安全的,甚至在使用看来是XPCOM类的自包含实例的情况下也是如此,因为最终,许多事情最终都将某些非线程安全的服务作为其实现的一部分进行了调用。这导致数据和/或内存损坏以及最终崩溃和数据丢失。这里的问题是/它并不总是破坏内存,因为不总是存在数据争用,而是在运行代码的每X次操作中造成破坏。人们通常习惯于开发和测试他们的东西,它碰巧可以工作,或者至少看起来像它可以工作,但是一旦有更多的人(又名用户)开始执行代码,崩溃就开始堆积起来。
可以在C ++代码中在主线程外运行代码,但是它具有相同的问题,很多XPCOM都不是线程安全的,因此您需要谨慎选择在不同线程中运行的内容,即仅访问被显式标记为线程安全的内容,但是即使使用此类标记,也可能存在线程安全错误。
因此,您不能在JS的另一个线程中使用XPCOM(除非有专门的组件为您执行此操作,例如nsIAsyncStreamCopier
),即使在C ++的另一个线程中运行XPCOM也需要大量的知识,技能和时间来调试,如果在崩溃之后出现崩溃所有。
如果您确实愿意,那么可以在JS中轻松实现诸如zip-writer之类的事情,并在Worker中运行。例如,zip格式并不是特别难于实现,尤其是在您不需要实际压缩的情况下,并且OS.File允许您最方便地从工作人员执行文件I / O。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句