分析easyswoole3.0源码,协程连接池(五)
连接池的含义,很多都知道,比如mysql的数据库连接是有限的,一开始连接mysql创建N个连接,放到一个容器里,每次有请求去容器中取出,取出用完再放回去。
es3demo里,有mysql的连接池。
EasySwooleEvent::30行,执行initialize方法会注册一个MysqlPool::class MysqlPool是继承于AbstractPool的只实现了createObject方法来创建mysql连接对象 AbstractPool这个抽象类,里我们分析下2个函数getObj和recycleObj。
EasySwoole\Component\Pool\AbstractPool::35和57行
getObj函数,当协程的chan还是空的时候不一定指的是初始化,可能是连接池的mysql连接都被用光了还没被回收,举个例子,如果我的连接池容量是10,现在10个用户同时访问我,我从连接池取出了10个现在连接池空了,等10个人随便某人用完了回收,连接池又不空了。这样就能理解为什么还
要判断当前创建的数量是否大于连接池容量。如果没有大于说明现在还可以继续往容器里防止连接对象而不会溢出连接池容量。其他情况就直接尝试从chan取出连接池对象。如果获取失败也是允许的。并发场景下获取不到连接池能容忍。
public function getObj(float $timeout = 0.1)
{
//懒惰创建模式
$obj = null;
if($this->chan->isEmpty()){
//如果还没有达到最大连接数,则尝试进行创建
if($this->createdNum < $this->max){
$this->createdNum++;
$obj = $this->createObject();
if(!is_object($obj)){
$this->createdNum--;
//创建失败,同样进入调度等待
$obj = $this->chan->pop($timeout);
}
}else{
$obj = $this->chan->pop($timeout);
}
}else{
$obj = $this->chan->pop($timeout);
}
//对对象进行标记处理
if(is_object($obj)){
$key = spl_object_hash($obj);
//标记这个对象已经出队列了
$this->objHash[$key] = true;
$obj->last_use_time = time();
return $obj;
}else{
return null;
}
}
回收的话就简单了,把获取到连接池对象塞回去chan->push
public function recycleObj($obj):bool
{
if(is_object($obj)){
//防止一个对象被重复入队列。
$key = spl_object_hash($obj);
if(isset($this->objHash[$key])){
//标记这个对象已经入队列了
unset($this->objHash[$key]);
if($obj instanceof PoolObjectInterface){
$obj->objectRestore();
}
$obj->last_recycle_time = time();
$this->chan->push($obj);
return true;
}else{
return false;
}
}else{
return false;
}
}
示例demo是这样调用的
App\HttpController\Api1构造方法会去从连接池里获取数据库连接,然后afterAction会去调用recycleObject进行回收。
分析easyswoole3.0源码,协程连接池(五)的更多相关文章
- 分析easyswoole3.0源码,服务启动为例(二)
以下内容需要结合es的源码,不然可能会觉得跳跃.先描述下es启动的大致流程.es启动的时候注册异常处理函数以及加载配置文件.根据位置文件的设置选择启动哪种swoole服务.然后用一个事件注册类,注册s ...
- 分析easyswoole3.0源码,consoleTcpService(六)
前文讲过可以通过配置开启一个tcp服务,叫做consoleTcpservice.EasySwoole\EasySwoole\Core::83行 (new TcpService(Config::getI ...
- 分析easyswoole3.0源码,服务启动为例(一)
swoole已经升级到4了,主要的特性是更好的支持协程,easyswoole也为了更好支持协程推出了es3.我本地环境是php7.2.9 centos7 在github下载最新的3.0的demo.地址 ...
- 分析easyswoole3.0源码,Trace组件(四)
前文,我们访问地址的时候服务端会输出类似trace信息.那么原理是什么呢?其实es3已经把这个独立出来作为单独组件了,名字叫做Trace组件 在demo里的调用原理是 EasySwooleEvent: ...
- 分析easyswoole3.0源码,体验es3(三)
demo在手,总得去试试看效果吧.我们先把默认的服务改成webserver,并且添加数据库的配置. 建立数据库,github里面有相关内容 CREATE TABLE `user_list` ( `us ...
- Swoole 实战:MySQL 查询器的实现(协程连接池版)
目录 需求分析 使用示例 模块设计 UML 类图 入口 事务 连接池 连接 查询器的组装 总结 需求分析 本篇我们将通过 Swoole 实现一个自带连接池的 MySQL 查询器: 支持通过链式调用构造 ...
- Druid源码阅读之连接池
概述 Druid是阿里巴巴开源的一个数据库连接池 源码地址.下面简单分析一下连接池是怎么实现的 怎么开始阅读 如果使用过Druid连接池的都只要在Spring配置中配置jdbc的时候配置Driver是 ...
- Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五)
Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五) 题记:关于SolrCloud的Recovery策略已经写了四篇了,这篇应该是系统介绍Recovery策略的最后一篇了 ...
- Solr4.8.0源码分析(14)之SolrCloud索引深入(1)
Solr4.8.0源码分析(14) 之 SolrCloud索引深入(1) 上一章节<Solr In Action 笔记(4) 之 SolrCloud分布式索引基础>简要学习了SolrClo ...
随机推荐
- 用kickstart创建逻辑卷管理LVM分区
创建两个物理分区分别给Boot和Swap分区,剩余的空间作LVM. Partition Size Name------------------------------/boot ...
- Python数据类型的内置函数之str(字符串)
Python数据类型内置函数 - str(字符串) - list(列表) - tuple(元组) - dict(字典) - set(收集) str(字符串)的一些操作 - 字符串相连方法 # 字符串的 ...
- java生成word
import freemarker.template.Configuration; import freemarker.template.Template; import javax.servlet. ...
- (Python基础)字符编码与转码
ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧 ...
- Redis单机版分布式锁实现
转载自:https://www.cnblogs.com/linjiqin/p/8003838.html Redis分布式锁的正确实现方式 前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基 ...
- Django:学习笔记
学习视频:链接:https://pan.baidu.com/s/1KzKUYVLQOlagMfSzq1MEDw 密码:y3qq Django 版本对应的 Python 版本: Djang ...
- 打造适合自己的vim编辑器方法总结
vim使用方法总结 说明:这是打造适合自己的vim编辑器的进阶方法,关于vim基础知识,请自行百度.也可参考文章末尾推荐blog网址 如果觉得自己打造vim编辑器麻烦,可以从github上面克隆一个, ...
- thinkphp51初始化方法initialize
此方法是在所有方法之前被调用的. class Index extends Controller { public function _initialize() { echo 'init<br/& ...
- PHP SoapClient 调用与鉴权,以及对Java和C# 的webservice的兼容处理
SoapClient使用注意事项: 第一要加上 cache_wsdl参数,以防服务器调用的是缓存的wsdl文件 然后是参数传递,如果是使用PHP自己写的WebService,参数传递按正常方式即可 1 ...
- python中线程2
cpython中的GIL和pool GIL锁(全局解释器锁) 1.what? GIL是全局解释器锁,和普通锁加在数据上不同的是:GIL加在加在解释器上,是为了防止多个线程在同一时间执行python字节 ...