注意: 不要在主进程中初始化数据库、memcache、redis等连接资源,因为主进程初始化的连接可能会被子进程自动继承(尤其是使用单例的时候),所有进程都持有同一个连接,服务端通过这个连接返回的数据在多个进程上都可读,会导致数据错乱。同样的,如果任何一个进程关闭连接(例如daemon模式运行时主进程会退出导致连接关闭),都导致所有子进程的连接都被一起关闭,并发生不可预知的错误,例如mysql gone away 错误。
推荐在onWorkerStart里面初始化连接资源。
上面是手册 http://doc.workerman.net/development/before-development.html 摘出来的。
1、主进程中初始化连接资源,会导致子进程都持有同一个链接资源,容易导致数据混乱,这个可以理解了。
2、但是每个子进程中的链接资源,就不会导致这个进程中处理数据混乱了吗?拿数据库连接来说,我的理解是,每个子进程能并发处理请求,那说明不同请求都会使用数据库连接资源,甚至不同请求都在处理同一条数据。这样不会导致数据混乱吗,是什么机制呢?
每个worker进程都是独立的连接,在单worker进程里面是同步阻塞执行的,执行完例如webman每次都会重置request对象所以不会发生数据污染。
意思也是类似php-fpm的运行方式吗?
我查资料,pfm的运行方式是这样。每个worker在启动后阻塞着,有请求到达后worker开始读取请求数据,读取完成后开始处理然后再返回,在这期间是不会接收其它请求,也就是说fpm的子进程同时只能响应一个请求,只有把这个请求处理完成后才会accept下一个请求
那意思像workerman中,如果设置worker=4,意思是同一时刻,只能处理4个请求吗
webman,本质是同步阻塞模式,比如有200个进程,那么,同一时刻,只能同时处理200个请求
可以理解为每个worker子进程的数据库连接也是相互独立的了?其中一个worker的数据库i/o阻塞或中断不会影响其它子进程,是这样的吗?
work进程都是独立的,互不影响