Javascript并发控制
作为一个教育项目,我正在用JavaScript编写(另一个)编辑器风格的实时语法高亮 为了保持编辑器的响应性,我显然选择了异步运行荧光灯,但是对于我使用的模型,如果在当前荧光灯完成之前键入了内容,我需要能够在启动另一个荧光灯之前终止荧光灯,并且知道它在新的荧光灯开始之前终止 我正在考虑做如下事情:Javascript并发控制,javascript,concurrency,Javascript,Concurrency,作为一个教育项目,我正在用JavaScript编写(另一个)编辑器风格的实时语法高亮 为了保持编辑器的响应性,我显然选择了异步运行荧光灯,但是对于我使用的模型,如果在当前荧光灯完成之前键入了内容,我需要能够在启动另一个荧光灯之前终止荧光灯,并且知道它在新的荧光灯开始之前终止 我正在考虑做如下事情: var terminate = false; var terminated = false; function work() { while(!terminate) console.lo
var terminate = false;
var terminated = false;
function work() {
while(!terminate)
console.log('working');
terminated = true;
}
function stop() {
terminate = true;
while(!terminated);
console.log('stopped');
}
setTimeout(work, 0);
setTimeout(stop, 10);
然而,这个例子不起作用,我尝试使用更多的设置超时来代替繁忙的等待,但也并没有效果
有没有一种方法可以用JavaScript实现这样一个系统,或者我应该使用某种替代方法(或者两者都使用)?如果您可以在不使用DOM访问的情况下完成大部分工作,这将非常适合web工作者 要修复您的示例,请尝试使用
setTimeout
和0
生成控件。这项工作:
var terminate = false;
var terminated = false;
function work() {
if(!terminate) {
console.log('working');
setTimeout(work, 0);
}
else terminated = true;
}
function stop() {
terminate = true;
if(!terminated) {
setTimeout(stop,0);
}
else console.log('stopped');
}
setTimeout(work, 0);
setTimeout(stop, 100);
编辑
解释原始代码片段的问题:Javascript是单线程的(除非您使用的是web workers)。您可以使用events、callbacks和setTimeout来实现并发的假象,但您真正要做的是告诉运行时在将来某个时间在单个执行线程上执行回调函数。在您的情况下,stop
从未执行过。10毫秒后,计划运行“下一步”(即工作
完成后)。由于工作
从未完成,停止
无法运行
这样,你想从JavaScript中获得的任何并发性都是协作的。你的工作线程将不得不暂停并明确地允许“其他东西”来保持这种错觉。在这种情况下,
考虑使用。大多数的现代浏览器支持它们。没有工作者,JavaScript中没有真正的一致性(这很好)。-所有操作都在一个线程中完成
大量的
setTimeout()
调用是一个杀手。啊,这确实有效,不确定我必须做什么:/虽然不应该terminated=true;
在else
而不是if
中,以防止不必要的setTimeout?是的,那会更好。修复。