hyperf icon indicating copy to clipboard operation
hyperf copied to clipboard

[QUESTION] 自定义进程类属性process有pid,但是ProcessCollector里面取出来的process pid是null,导致无法对应

Open caijwei opened this issue 2 years ago • 3 comments

Before you submit this issue, you has been search all existed issues and search the documentation

  • [] I've been search all existed issues
  • [] I've been read all documentation

Describe your question

我创建了一个自定义进程类,nums是3,分别处理三类数据

并在自定义进程内部,将这三类数据的类型和这三个进程的pid绑定在一起 image

然后进程中通过 $msg = $this->process?->pop(); 获取数据,进行处理

我原本的想法是通过ProcessCollector::get($this->name),拿到三个process,并根据pid判断应该往哪个进程push数据,但是取出的process,根本没有pid,所以只能通过广播给三个进程,让每个进程自己识别消息处理

有没有办法可以将ProcessCollector里的process和自定义进程对应起来,来实现1对1push,而不是广播给所有进程

image 通过代码看,这两个process并不是一个对象,所以才一个有pid,一个是null吗?

caijwei avatar Sep 21 '23 06:09 caijwei

我原本的想法是通过ProcessCollector::get($this->name),拿到三个process,并根据pid判断应该往哪个进程push数据,但是取出的process,根本没有pid,所以只能通过广播给三个进程,让每个进程自己识别消息处理

这里,拿出了 process 之后,再反射拿一下对应的 process 呢?

limingxinleo avatar Sep 21 '23 08:09 limingxinleo

我原本的想法是通过ProcessCollector::get($this->name),拿到三个process,并根据pid判断应该往哪个进程push数据,但是取出的process,根本没有pid,所以只能通过广播给三个进程,让每个进程自己识别消息处理

这里,拿出了 process 之后,再反射拿一下对应的 process 呢?

好像不行 ,我是继承了bindServer,在后面循环ProcessCollector::get($this->name),并进行$process->useQueue(mode: Process::IPC_NOWAIT)设置,而此时handle还没执行了,就算反射了 也肯定拿不到pid,而如果每次push时反射效率太低,emmmm 对象本身是引用传值,为啥这俩对象会变得毫无关联呢

caijwei avatar Sep 21 '23 10:09 caijwei

你做一个虚拟pid,然后跑起来之后再进行虚拟和实际pid对应呢?

limingxinleo avatar Oct 05 '23 07:10 limingxinleo