[英]Terminate a WebWorker (Javascript)
我正在编写一种用于教育目的的语言,该语言应在网络浏览器中运行。 该语言可编译为JavaScript。
因此存在无限循环和递归的问题。 在那之前,我认为解决方案是将运行时实现为WebWorker,并在ui上添加一个按钮,如果运行时间过长,则将其终止。
我只是在测试我的语言时发现,通过调用runtime.terminate()
,Web Worker并没有真正终止。
至少直到他的上一份工作完成为止,我还没有测试如果完成该怎么办。 即使在到目前为止找到的文档中,它也指出它会立即停止执行。
因此,即使用户可以继续那样工作,后台正在运行的工作程序也可能耗尽资源并导致浏览器至少没有响应。
因此,为了响应用户事件,在发生无限循环或递归的情况下,我需要任何方法来终止执行。 由于我找不到任何使线程在JavaScript中进入睡眠状态的方法,因此该方法也不起作用,或者Web工作人员是否有诸如睡眠之类的东西?
您有什么建议我可以做什么?
我会这样做:
1)让编译器生成代码,而不是从头到尾执行该程序,而是将其分成多个段-例如,循环的主体或函数的主体可以是一个段。
2)每个段应以timeoutId = setTimeout(nextSegment, 0)
。 这允许Web Worker在执行段之间接收并响应异步事件。
3)当您要终止Web Worker时,请使用window.postMessage()
向其发送异步消息。
4)在网络工作者中,有一个事件处理程序,该事件处理程序在收到该消息后会执行clearTimeout(timeoutId)
。
感谢您的答复,我已经考虑过这种方式,因此实际上我不需要网络工作者。 因此,这种方法的缺点是:
1)我将必须将循环实现为递归函数调用...
更大的问题2)段的大小必须限制为一个命令,这种方法才能真正起作用,因此我将必须将每个命令包装到一个调用下一个命令的函数中,这将是巨大的开销...
那就是为什么我要寻找解决方法(如果有)?
是的,我正在编写一个编译器。
在使用这种方法时,我必须提到,可能用户的开销可能不大,但是对编译的影响确实很大……这就像在Javascript之上构建VM一样……
我要说的是,除了上述要点之外,我还需要:
-需要用于函数命名的复杂索引系统-注意变量分配-必须解决串联表达式-...
这就是为什么我在寻找更优雅的版本...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.