感觉在runAll()之前实例化mysql或者redis是可以的,因为是copy on write

0

workerman文档里面建议将redis或者mysql的实例步骤放到onWorkerStart里面,fork之后执行onWorkerStart,这样实例就是属于这个子进程的。
但是在测试中,我发现如果在runAll前实例化,这个资源数据是copy on write的,并没有发现在runAll外面实例化有什么影响
测试代码如下:


图片
 
在id为0的子进程中改变redis实例,并不会影响id为1的子进程
两次curl请求,第二个请求redis插入不进去
 
为了测试copy on write


图片
两次curl请求,第一个输出5,第二个输出10
 
可见:
1.子进程继承父进程的数据,是以copy on write模型
2.在runAll实例化redis和mysql,好像并没有什么不可
 
 
以上不知道是对是错

已邀请:

walkor

赞同来自:

高并发下会有问题

walkor

赞同来自:

比如主进程初始化了一个mysql连接,fork后的各个子进程会继承主进程的连接资源,这个资源猜测应该不会copy on write,你会发现mysql服务端只看到一个连接,但是各个子进程都有能对这个mysql连接读写,如果出现同时读写应该会造成mysql连接异常。

要回复问题请先登录注册