我應該使用工作進程還是子進程來運行我的函數?

noobcode0000

我有兩個文件,main.jsjob.js當在 main.js 中單擊一個按鈕時,我希望在job.js中運行一個新的、單獨的函數進程

這個過程的作用是啟動一個新的 puppeteer 瀏覽器實例。當停止按鈕被點擊時,這個進程應該被pid殺死。(為此我們使用process.kill(child.pid)?)

那麼我是否想要使用工作進程或子進程,如果這兩者中的任何一個,我將如何實現它以運行此功能?

重要提示:每次單擊開始按鈕時,我都希望啟動一個運行該功能的新進程,因此可以殺死具有該 pid 的特定進程。

西爾萬·布雷吉

我建議您為模塊使用包裝器child_process模塊。使用execa模塊的示例用法

主程序


const { execa } = require('execa')

// function for spawning a process with cancel handle!.
async function spawnSubprocess(command, args, cb) {
        let subprocess = execa(command, args);

        // create a cancel function for later usage!.
        function cancel() {

            if(subprocess) {
                subprocess.kill('SIGTERM', {
                    // wait for it to terminate before killing it.
                    forceKillAfterTimeout: 1500
                });

                // set to null so it won't be killed mutliple times.
                subprocess = null
            }
            
        }

        // add the event listener to subprocess when it's done!
        // Can be used for logging or for correctly awaiting a process 
        // termination before proceeding.
        subprocess.then(() => {
            subprocess = null
            cb()
        })
        .catch(err => {
            subprocess = null
            cb(err)
        })

        // return the cancel handler !.
        return cancel

}


// reference to the last cancel. It has to be accessible in 
// onClickHandler ofc!.
var processCancel = null

// call this function on click.
// keep the processCancel in scope!
function onClickHandler() {

    // first, check if a process is already running
    if(typeof processCancel === 'function') {

        console.log('Process already running. Calling cancel!')
        // the process is not directly terminated. You amy have 
        // 2 seconds where multiple instances are running but that's not a big deal i guess.
        processCancel()
    }

    // spawn the new process !
    // adjust the path to job.js ofc!.
    processCancel = spawnSubprocess('node', ['job.js'], (err) => {

        // on done callback!. Log some information!.
        if(err) {
            console.error('Process error ', err)
        } else {
            console.log('process stopped / DONE')
        }

        processCancel = null
    })

}

這應該讓您了解如何實施它。我建議使用child_process或任何包裝模塊。^^

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

lodash 函數式編程如何在 _flow 中進行部分應用

進程運行時是否可以使用進程輸出?

與函數一起使用時,節點子進程(Spawn)未正確返回數據

該程序運行良好,但我需要使用 1 個函數而不是 3 個

啟動/停止 Azure Web 應用 Azure 函數/進程

XLXS 是寫在內存中的工作表還是一個獨立的 I/O 進程

Django 進程運行任務而不是 Celery

使用子進程調用 NotePad++ 後,Python 不會開始執行其他代碼,直到我關閉 Notepad 程序

我應該使用更通用的變量別名/類型還是使用我將使用的函數採用的變量類型?

使用 Kotlin 協程按順序運行 evaluateJavascript() 函數

執行命令時使用子進程與終端的問題

我應該使用指針還是引用?

在python中使用子進程時在cmd中提示

為什麼我得到 ':' expected”?我正在嘗試定義一些函數來運行一些單元測試以進行基準測試

不使用專用函數的進程間消息傳遞

我應該在顫振中使用 bloc 進行 firebase 身份驗證嗎?

使用 python 子進程響應 bash 中的交互式程序

我應該對我的代碼進行哪些更改才能使我的代碼正常工作?

使用 PATH 變量中的子進程執行自定義命令

在 R Shiny 中,isTruthy() 函數沒有按照我認為應該的方式工作

我有一個開頭相同但結尾總是一些隨機數的響應,我想使用通配符進行比較,我該怎麼做?

多處理進程不運行

我應該刪除將在進程生命週期內持續的堆對象嗎?

我應該使用 AddDbContext 還是 AddDbContextPool

為什麼我應該更喜歡單獨的函數而不是 C++ 中的函數式編程的靜態方法?

我如何修改我的代碼以適應該函數以使其正確運行?

在linux中並行運行N個進程

如何清除在目標端口上運行的進程?

在 R Shiny 中運行後台進程