如何在Javascript中实现一个UML同步条?
How to implement a UML synchronisation bar in Javascript?
因此,Javascript 异步处理得非常好,因为它可以传递一个事件处理函数,例如取自此 example
的代码
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});
而且我想知道,如果有人将一个代码分解为异步块,有时您会希望所有线程都等待 regroup/gather,在 UML 中,我认为这是一个 Synchronisation Bar(图 2 和 3 中的粗黑实心水平矩形)
我想知道这在 Javascript 中看起来如何。在 Windows 代码中,可以设置 Mutex 和 Semaphore 等
那么,请问如何在Javascript中实现一个UML同步栏?
正如您所指出的,JavaScript 是单线程的,因此不需要像 Mutexes 和 Semaphores 这样的多线程同步原语。一种思考方式是有一个隐式的单一全局互斥量,每个异步回调在进入时获取该互斥量。或者用简单的英语来说:只有一个函数同时执行。
因此,您要做的是实现与信号量类似的簿记,使用普通变量,例如计算未完成异步请求数的全局变量。根据您的代码,您可以让每个回调检查它是否是最后一个,如果是,则触发继续;或者您可以定期轮询计数器(这样不太优雅)。
大致:
var g_semaphore = 0;
function GetCallback(i) {
return function() {
console.log("callback #" + i + " coming back");
/* ... do stuff ... */
g_semaphore--;
CheckSyncBar();
};
}
for (var i = 0; i < 5; i++) {
console.log("requesting callback #" + i);
g_semaphore++;
window.setTimeout(GetCallback(i), Math.random() * 5000);
}
function CheckSyncBar() {
if (g_semaphore > 0) return;
window.setTimeout(Continuation, 0);
}
function Continuation() {
console.log("all callbacks are done, continuing");
/* ... do stuff ... */
}
因此,Javascript 异步处理得非常好,因为它可以传递一个事件处理函数,例如取自此 example
的代码connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});
而且我想知道,如果有人将一个代码分解为异步块,有时您会希望所有线程都等待 regroup/gather,在 UML 中,我认为这是一个 Synchronisation Bar(图 2 和 3 中的粗黑实心水平矩形)
我想知道这在 Javascript 中看起来如何。在 Windows 代码中,可以设置 Mutex 和 Semaphore 等
那么,请问如何在Javascript中实现一个UML同步栏?
正如您所指出的,JavaScript 是单线程的,因此不需要像 Mutexes 和 Semaphores 这样的多线程同步原语。一种思考方式是有一个隐式的单一全局互斥量,每个异步回调在进入时获取该互斥量。或者用简单的英语来说:只有一个函数同时执行。
因此,您要做的是实现与信号量类似的簿记,使用普通变量,例如计算未完成异步请求数的全局变量。根据您的代码,您可以让每个回调检查它是否是最后一个,如果是,则触发继续;或者您可以定期轮询计数器(这样不太优雅)。
大致:
var g_semaphore = 0;
function GetCallback(i) {
return function() {
console.log("callback #" + i + " coming back");
/* ... do stuff ... */
g_semaphore--;
CheckSyncBar();
};
}
for (var i = 0; i < 5; i++) {
console.log("requesting callback #" + i);
g_semaphore++;
window.setTimeout(GetCallback(i), Math.random() * 5000);
}
function CheckSyncBar() {
if (g_semaphore > 0) return;
window.setTimeout(Continuation, 0);
}
function Continuation() {
console.log("all callbacks are done, continuing");
/* ... do stuff ... */
}