溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

windows下node.js進程間傳遞客戶端socket的一些規(guī)律

發(fā)布時間:2020-07-11 17:17:06 來源:網絡 閱讀:542 作者:malpower 欄目:web開發(fā)

最近在update我的一個github項目的時候,想要把原來單一進程的模式改成多進程的模式。

事情是這樣的,我做了一個HTTP服務器,支持動態(tài)腳本。

在完成了一大堆各種各樣的特性后,遇到了一個腳本超時的問題。

在我的HTTP服務器中,將頁面分成了Template和Activity兩個部分,一個是用做VIEW的,一個是用作MODULE的,也就是類似于ASP啦。

但是,由于NODE.js是單進程的,所以我無法控制Activity中的代碼(為用戶腳本)。

所以,如果Activity中出現死循環(huán),那么整個http服務器就會因此死掉,所以我想做一個檢測腳本超時的特性。

===================================割了==========================



好了,進入正題。

我的想法是這樣的,從主進程來接受socket,然后send給子進程,然后由子進程進行相關的操作(包括域名分析、POST讀取等行為)之后執(zhí)行請求的用戶Activity。這個字進程每隔一段時間向主進程發(fā)送一個alive消息,如果超過了一段時間子進程都沒有向主進程發(fā)送alive消息,那么主進程就kill掉子進程,防止超時的腳本繼續(xù)執(zhí)行,之后新啟一個進程代替剛才被kill掉的子進程。



想法是這樣的,但是遇到了一些問題。

本以為這個事情可以很輕松的完成,但是在主進程發(fā)送socket給子進程后,子進程會綁定一個data事件在傳來的socket上。問題來了,在子進程中,如論如何都無法出發(fā)data事件。

后經實驗,情況是這樣的,socket在被主進程發(fā)送給子進程之前,客戶端發(fā)送來的數據就已經發(fā)送給主進程了,所以在子進程中沒有數據可讀,自然就如法出發(fā)data事件。

經過修改,我在主進程中讀取一個請求數據,然后連socket帶第一次讀取的數據,一起發(fā)送給了子進程。

主進程將socket發(fā)送給子進程后,主進程中的socket好像會被自動關閉。好吧,這對我沒有影響。





簡短的總結:

客戶端socket會一次性發(fā)送一條請求的全部數據至主進程,子進程讀取socket前所有內容都已經被發(fā)送給主進程了。

在某個進程發(fā)送socket給其他進程后,在本進程內的socket會被標記為已關閉。





希望我的一點點實踐可以幫到讀到這篇文章的同志。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI