我有一个worker1作为客户端,创建了一批任务(假设有400个),希望通过AsyncTcpConnection实现异步,然后开了另一个worker2,建立一个worker1 到worker2的连接
通过foreach send 给worker2 发送数据,经过我的测试发现,在linux下,即便我给worker2开了100个进程(count = 100),结果在worker2这边收到数据时候的进程id都是一样的
我的问题是:
1、是不是一个worker1和worker2的连接,worker1每次send的时候,worker2那边接收都用的是同一个进程。如果是这样,那count好像就没有意义了,因为我如果要把400个任务分发给worker2去处理,似乎必须要在worker1上创建400个worker1到worker2的连接
2、上面的是我测试之后的结果,不晓得是不是这样,或者说我对进程理解有问题。然后是,如果我希望将400个任务发给worker2不同进程,又不希望worker1创建太多连接,应该怎么做?
3、文档上对于这一块的例子是把那个send的任务当做一个耗时操作去看的,现在我有n多任务,所有任务执行算是一个耗时操作(而不是多个),如果需要实现这种需求,正确的设计应该是怎么样的
这三个问题意思差不多,可能是我的理解错了,希望大大指正(如果真的是理解错了,那应该不需要三个问题都回答了)
总的来说操作系统为了降低负载会尽量减少进程间切换,当一个进程能瞬间做完的事情不会分配给多个进程去处理,而获连接是瞬间就可以完成的事情,所以连接都被几个进程获得的几率就会很大。如果测试改成发起连接发送数据,发起连接发送数据,这样的测试方式,那么就会大大改善。
如果你的php版本是php7,那么可以设置$worker2->reusePort = true; 这样就可以让操作系统平均分配连接给多个进程。
如果不是php7,可以在onConnect的时候调用下$worker2->puseAccept(),这样这个进程就会暂停获取连接,然后在发送完数据后调用$worker2->resueAccept()恢复获取连接。
我测试了一下,如果是“连接发送,连接发送”的方式去发送任务,虽然worker2会用多个进程去接收,但是执行顺序全乱了,如果我希望worker2是用多进程去处理数据,但是处理的时候按照任务的顺序去处理的,那应该怎么做呢
而且很奇怪的是,我用同样的测试数据去跑,乱的顺序居然也是一样的
如果你要想任务1完成后再运行任务2,这样没必要用多进程,用一个进程即可。