child_process分担任务问题
发布于 5 年前 作者 HyperClockUp 4168 次浏览 来自 问答

chilld process可以生成一个子进程,但是怎么处理父进程的任务呢?我查了官方文档,说是send方法可以传递一个TCP服务器或者Server,那么我父进程的任务怎么传递给子进程来帮我分担作业呢?

16 回复

worker.send() 相传这种方式用得少没事,用得多会有问题,好像是卡死吧,记得是以前在看某做游戏服务器的人写的文章时看到的

不是很理解,请问能更详细说明吗,worker是cluster的,我现在想不用cluster,自己写一个多进程的。比如我想父进程获取到任务后,拆分成多个子任务,分别传递给子进程,然后子进程执行完毕后,直接执行并且将结果send给父进程,我目前的想法是,能不能找到一个类似于send的方式,通过类似parent.send(function(){},callback)的方式来分配任务,一楼说的IPC message就是send办法吗?我试了试传递function但是好像不可以

父进程fork一个子进程出来,然后在父进程监听onMessage事件,用于监听子进程的传递消息,当子进程有消息传递过来,父进程中就能接收到。子进程执行完成之后,将返回结果通过send方法传递给父进程。如果要使用父进程传递过来的参数,也可以在子进程中添加onMessage事件。

需要注意的是,fork出来的子进程之间不共享父进程资源

@iflet 我明白怎么传参,但是传的参数不能是function,哪怕send(message)这个message对象中的属性值为function都会在子进程中忽略。也就是说,如果仅仅是传参,那么就必须在子进程中预设好对应执行的函数,无法做到动态分配任务,这样限制性太大了,所以想知道是不是有别的办法还是说我哪一步做错了

难道你想在主进程里面动态生成 fn ?这样不好啊。

@atian25 因为我现在想做一个可帮我自动分担任务的一个东西,比如说我现在要进行1000个文件的处理,我可以根据我的子进程数量,拆分成不同的子任务,再交给子进程去处理,处理完毕后将结果返回给主进程。不知道这样的想法可不可行,因为最近一直在看child process所以有了这样的想法。

但你的处理逻辑是可以写在单独的 js 文件里面,然后 2 边 require 啊,传递的只是要执行的任务名和简单的参数而已。

@atian25 好的 非常感谢你的解答,我明白了

@HyperClockUp function有上下文环境,有各种外部引用,还可能调用其他的function,所以跨进程直接传递function是不现实的。

不传function就不能动态分配任务了吗?

@HyperClockUp 其实你需要的是 faas

@myy 实力浅薄,我对node不是很熟悉,想到动态分配任务第一反应就是传入我要指定的function,所以才一直执着于找到一个办法来代替send

@HyperClockUp 传入function感觉是golang的goroutine特性

怎么会有跨进程传function这样的设计…,跨进程传function调用不就和远程调用(rpc)一样了

现在使用了9楼的办法,预先写好一些提取好的公共方法,封装成模块后在子进程中引用,父进程send消息给子进程来执行该包中的方法

回到顶部