1
leven87 OP 又查了一下资料,大概明白了,我这个多进程任务是 web 请求,属于 I/O 密集型任务,cpu 占用很少。时间瓶颈不在 cpu,所以多进程能够有效加快速度。
|
2
msg7086 2018-04-24 05:16:26 +08:00 5
你提问里说对了一半。
时间有两个指标,一个叫墙上钟时间,也就是现实中流逝的时间,另一个叫 CPU 时间,是 CPU 花费在执行程序的时间片的总和。 使用多线程和多进程,会减少 Wall clock 时间,但会增加 CPU clock 时间。 对于 CPU 密集型任务来说,单进程单线程效率更高。 对于经常需要 CPU 等待的任务来说,多进程多线程可以增加 CPU 利用率,减少现实流逝时间。 更好的选择是事件回调模型,既可以并发多任务,又不需要多线程支持,结合了两者的优点,效率最高。 |
4
wentaoliang 2018-04-24 11:18:54 +08:00 via iPhone
@msg7086 请问下 php 如果不借助 swoole 是否能实现回调机制或者类似的异步机制
|
5
leven87 OP @msg7086 感谢回复。前面的都可以理解。最后一句提到的事件回调,有些困惑。众所周知,js 里面有大量的事件回调函数,比如给 click 事件绑定回调函数等。当然,php 里面也可以有类似的先给参数注册一些回调函数。然后根据实际参数,执行对应的回调函数的做法,通常利用 call_user_func_array。但是这些回调函数都是同步的。没有看出可以并发多任务。是否可以具体说说机制,谢谢。
|
6
vincenttone 2018-04-24 14:14:21 +08:00 1
1. 因为涉及到 io,所以可以在等待时做时间片切换,节省了时间
2. php 可以试试单进程配合 ev 扩展看看效果。 3. php 和回调和 js 的回调因为并发模型不同,并发效果也不同,具体可以参考 js 的事件模型,同时参考 ev 里的 epoll 或者 select |
7
msg7086 2018-04-24 23:15:39 +08:00
@wentaoliang @leven87
PHP 很多年没玩了,据我所知 PHP 自己是很难支持这种结构的。 要玩事件回调不如去玩 JS。 很多业务场景下对性能的要求并不是很高,多线程多进程并发的性能已经足够好的情况下,不会随便就去重写成回调的。 |
8
leven87 OP @msg7086 @vincenttone
感谢。按照 @vincenttone 的建议,我试装了 ev 的扩展,还真是可以利用 EvTimer 做一个延时异步回调,不过如果 php 主程序执行完了,回调就 不会执行了。可能有更完善的方法,不过我没有去继续研究了。如同 @msg7086 所说,多进程和多线程已经可以满足大部分场景,使用这种回调对性能改善不会太多。php 也不擅长做这个,可能 python 在这方面的实现要更细腻一些。 |
9
vincenttone 2018-04-25 11:12:06 +08:00 1
|