簡體   English   中英

電子中的child_process.fork()

[英]child_process.fork() in Electron

是否可以從電子渲染過程中分叉child_process? 我在網上發現了一些帖子,但沒有提示如何讓我的代碼正常工作。 我創建了一個模塊,即fork子進程。 當我使用cmd和節點下運行時,此代碼可以正常工作。 但是當我嘗試將它集成到我的電子應用程序中時,我無法與child.send()方法進行通信。

// create fork
const fork = require('child_process').fork;
const fs = require('fs');

const img_path = [
'path/to/an/image1.jpg',
'path/to/an/image2.jpg',
'path/to/an/image3.jpg'
];

const cp = [];

const temp_path = img_path.map((item) => item);

createAndResize(2);

function createAndResize(num) {
    return childResize(createChildProcess(num));
}

function createChildProcess(num) {
    if(num <= 0) {
        return cp;
    } else {
        let cf = fork('./child.js');
        cp.push(cf);
        num -= 1;
        return createChildProcess(num);
    }
}

function childResize(list) {
    if(list.length <=0) {
        return true;
    } else {
     // child_process is created
        let child = list.shift();

         child.on('message', function (data) { 
                if (!temp_path.length) {
                    process.kill(data);
                } else {
                    child.send(temp_path.shift());  
                }
            });

            child.send(temp_path.shift());   

            setTimeout(function() {
                childResize(list);
            }, 1000);      
    }
}

//child.js
process.on('message', function(msg) {
console.log(msg); //this is never reached
};

編輯:基於下面的評論,我在主進程上分叉子進程。 通信似乎有一些例外。 但首先我的新代碼:

    // myView.js
    const { remote } = require('electron');
    const mainProcess = remote.require('./main.js');
    const { forkChildfromMain } = mainProcess;

    forkChildfromMain();


    // main.js
        const fork = require('child_process').fork;
        let cp = [];



function forkChildfromMain() { 
    createAndResize(4);
}

function createAndResize(num) {
        return childResize(createChildProcess(num));
    }
    function createChildProcess(num) {
        if(num <= 0) {
            return cp;
        } else {
            let cf = fork('./resize.js');
            cp.push(cf);
            num -= 1;
            return createChildProcess(num);
        }
    }

    function childResize(list) {
        if(list.length <=0) {
            return true;
        } else {
            let child = list.shift();

             child.on('message', function (msg) {
    // logs 'Hello World' to the cmd console
    console.log(msg);
    });
                child.send('Hello World');   
                setTimeout(function() {
                    childResize(list);
                }, 1000);      
        }
    }

exports.forkChildfromMain = forkChildfromMain;


    // child.js
    process.on('message', function(msg) {
    // this console statement get never loged
    // I think, I must integrate an icpModule
        console.log(msg);

    //process send msg back to main.js
    process.send(msg);
    })

陳述:現在的主要問題是,我認為電子'生成'新的子進程並且不進行分叉。 因為,當我看到我的任務管理器時,我只看到一個來自電子的實例。 當我在節點env中運行代碼時,我看到有多個fork節點實例。

我更喜歡在多個節點實例中分叉我的子進程的原因是,我想要進行許多圖像處理。 因此,當我分叉子節點時,每個子節點都擁有自己的帶有內存的節點實例,依此類推。 我認為當我只有一個為所有孩子分享內存和資源的實例時,這會更有效。

第二個意外的行為是,子項中的console.log語句未打印到我的cmd控制台。 但這是較小的:)

編輯:在我深入分析我的任務管理器之后,我看到,電子會產生多個類似於它的子進程。

Electron的渲染器過程不是分配子進程的正確位置,您應該考慮將其移動到主進程。

盡管如此,它應該按照你描述的方式工作。 如果你在某個地方提供一個最小的例子,我可以仔細看看。

暫無
暫無

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

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