假設我們有一個Web服務器接收http請求併發迴響應。它有很多端點,包括這一個如何阻止事件循環直到完成運行異步任務
/task
應該有一些異步任務,如從Redis
讀/寫,我想阻止事件循環,直到這些任務完成。我知道這是不合理的,因爲事件循環還需要繼續努力以接收Redis
的事件。所以我想把這個邏輯放在一個單獨的腳本中,並使用child_process.spawnSync
來執行並等待它並阻止當前的事件循環。這個解決方案可以工作,但我的問題是我的邏輯,異步任務比本示例中提到的更復雜,它們依賴於當前腳本,它們是框架的一部分,將它們分離爲單獨的腳本並不容易。有什麼建議麼 ?
var express = require('express');
var app = express();
var redis = require('./redis');
// Block the event loop until finish doing some async tasks
app.get('/task', function(req, res) {
// Block the event loop now
redis.get('backup', function(error, backup) {
// ...... Do some changes to the backup data
redis.set('backup', backup, function(error, result) {
// Unblock the event loop now
res.send('I am done');
});
});
});
// To check if the event loop is really blocked
counter = 0;
setInterval(() => { console.log(counter++) }, 100);
app.listen(5000);
'有什麼建議?',是的。不要阻止。目前還不清楚爲什麼在你的描述中你也需要.. – Keith
爲什麼我需要阻止並不重要,問題在於如何。無論如何,我需要將一些會話狀態備份到Redis中,並防止接收可能導致這些數據無效的事件,直到完成將當前會話狀態存儲到Redis中,然後繼續處理接收到的事件,這就是爲什麼我需要阻止事件循環以讓這些事件排隊並防止競賽狀況。 – faressoft
您可以在不阻塞主線程的情況下做到這一切。無論如何,你說任何建議,那是我的。如果這是一個多用戶網站,這樣做會削弱它。 – Keith