最近miniblink的electron模式开发本来一切顺利,但昨天遇到一个大坑。
electron里主进程和渲染进程是分开的,在miniblink的electron模式里是使用多线程模拟的,每个线程都有自己的v8 context。本来一切ok,但
在跑vscode的时候,发现一处大坑!
vscode的node_modules\gc-signals 模块,是个native 模块,vscode在导入一个文件夹的时候,会重启整个渲染进程,这样gc-signals 也会被重新加载一遍,重新在native层注册各种V8里的函数。这在多进程下没问题,每次重新加载时会重启一个新进程,重新注册v8函数。
而多线程模拟的就不行了。如果每次重新调用注册函数,gc-signals 里由于native代码用到了全局变量,全局变量是会被反复初始化的。这就尴尬了,有些如uv_mutex_t是不能重复初始化的。
目前想来想去,只能搞过架构大重构了,把之前精心设计、精巧简单的单进程多线程模式改造成多进程了,然而,多进程调试起来麻烦多了。