对workman的进程概念有些模糊,举个例子:
例如我,$worker->count=1,只指定一个进程,那这一个进程可以同时接受并处理多个请求吗,还是说这一个进程必须处理完一个请求后,其它请求才可以进入?
这一个进程,同时只能处理1个请求,这个请求处理完了,才能接着处理下一个请求
对的,进程内部是顺序执行的。一个进程处理一个请求?
传统的fpm模式就是这种吧?
是的,php-fpm也是多个进程来处理请求
进程处理请求的方式看业务代码使用的是哪些库。
如果业务调用的是pdo mysql 、redis扩展等这些阻塞接口,那么单个进程处理完一个请求后才能处理下一个请求。这种情况下提高并发量需要多开一些进程,例如cpu的2-4倍,利用多进程来提高吞吐量。
如果业务调用的都是是异步非阻塞接口,比如 workerman/redis workerman/http-client等。或者是调用的swole/fiber协程(例如设置 Worker::$eventLoopClass = Workerman\Events\Swoole:class; Co::set(['hook_flags'=> SWOOLE_HOOK_ALL]);)那么单个进程内可以看作是并发处理。
workerman/redis
workerman/http-client
Worker::$eventLoopClass = Workerman\Events\Swoole:class; Co::set(['hook_flags'=> SWOOLE_HOOK_ALL]);
如果是异步非阻塞,单个进程可以并发处理,但是从微观角度讲一个cpu只能处理一个进程,那一个进程也只能同时处理一个请求,只不过执行速度很快,我们感知不到,让我们觉着是并发处理的。是这样吗老大?
对
这一个进程,同时只能处理1个请求,这个请求处理完了,才能接着处理下一个请求
对的,进程内部是顺序执行的。一个进程处理一个请求?
传统的fpm模式就是这种吧?
是的,php-fpm也是多个进程来处理请求
进程处理请求的方式看业务代码使用的是哪些库。
如果业务调用的是pdo mysql 、redis扩展等这些阻塞接口,那么单个进程处理完一个请求后才能处理下一个请求。这种情况下提高并发量需要多开一些进程,例如cpu的2-4倍,利用多进程来提高吞吐量。
如果业务调用的都是是异步非阻塞接口,比如
workerman/redis
workerman/http-client
等。或者是调用的swole/fiber协程(例如设置Worker::$eventLoopClass = Workerman\Events\Swoole:class; Co::set(['hook_flags'=> SWOOLE_HOOK_ALL]);
)那么单个进程内可以看作是并发处理。如果是异步非阻塞,单个进程可以并发处理,但是从微观角度讲一个cpu只能处理一个进程,那一个进程也只能同时处理一个请求,只不过执行速度很快,我们感知不到,让我们觉着是并发处理的。是这样吗老大?
对