簡體   English   中英

從child_process.fork()獲取結果,然后響應客戶端

[英]Get Result from child_process.fork() and then Respond to the Client

對於從child_process.fork()獲取結果然后響應客戶端,我感到困惑。 執行時的Node.js服務器是否能夠響應更多請求,即讓用戶可以在child_process仍在執行並且用戶能夠獲得最新請求的響應的同時向服務器發送其他任何請求,是否正確?

參考代碼:

router.route('/analysis')
.get(function(req, res, next){
User.find({}, {'_id': true, 'are_you': true})
    .exec(function(err, user){
        if(err) return next(err);
        var child = child_process.fork(__dirname + '/analysis.js', [], {});
        child.send('Hi');
        child.on('message', message => {
            console.log('message from child:', message);
        });
        res.status(200).json(user);   //does here client puts other requests in event queue, until the child process executes completely and responds?
    });
});

讓我們看一下關鍵行:

var child = child_process.fork(__dirname + '/analysis.js', [], {});

此行告訴Node您要進行分叉,並返回一個ChildProcess來表示該動作。 但是,實際的分叉尚未發生,因為它是異步執行的。 它不會等待這種情況發生,您的代碼將繼續運行。

child.send('Hi');

再一次沒有任何反應,這只是將消息排隊發送給派生進程。 send方法應返回true以指示您的消息已成功添加到隊列中,但這不能保證它會真正傳遞。 如果您需要有關消息是否通過的反饋,則需要傳遞回調以send 這都是異步的,因此您再次需要代碼繼續運行下一行而不是等待。

child.on('message', message => {
    console.log('message from child:', message);
});

這將在ChildProcess上注冊message事件的ChildProcess 注冊會立即進行,但是在繼續運行代碼之前,它不會等待收到消息(請注意,回調內部的代碼直到收到消息后才會運行,現在將被跳過,並且執行在下一行繼續)。 請記住,分叉實際上還沒有發生,您所要做的就是與代表即將創建的子流程的ChildProcess對象進行交互。 同樣,一切都是異步的,因此代碼繼續運行到下一行。

res.status(200).json(user);

發送對當前請求的響應。 子進程仍然沒有產生,它坐在隊列中等待代碼結束。 就Express而言,請求現已完成,客戶端(即瀏覽器)將很快收到響應。 但是,這並不意味着子進程將被丟棄。 一旦Node有機會,它就會產生該過程,並且任何消息或事件都應像未響應請求一樣進行。 您唯一不能做的就是再次回應。

您在ChildProcess上執行的所有操作都是異步的,因此它們實際上都不立即執行任何操作,它們只是作為“要做的事情”排隊。 正如當前所寫的那樣,您的代碼將在子進程產生之前響應HTTP請求。 如果您想在子進程得到一些結果之后發送響應,則必須移動代碼以發送響應,以使其位於適用於ChildProcess事件的ChildProcess

關於您有關同時出現多個請求的問題,這完全有可能發生,並且可能同時分叉多個子進程。 如果您的子進程無法處理一次運行多個副本的情況(例如,因為它們都需要寫入同一文件),那么您需要防止這種情況自己發生,Node不會幫您這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM