Swoole2.0官方默认的实例是短连接的,在请求处理完毕后就会切断redis或mysql的连接。实际项目可以使用连接池实现复用。

实现原理也很简单,使用SplQueue,在请求到来时判断资源队列中是否有可用的连接,如果有直接拿来复用。如果没有就创建一个新的连接。在连接使用完毕后再讲它重新放回到队列,此连接就可以被其他协程复用。

$count = 0;
$pool = new SplQueue();
$server = new Swoole\Http\Server('127.0.0.1', 9501, SWOOLE_BASE); $server->on('Request', function($request, $response) use(&$count, $pool) {
if (count($pool) == 0) {
$redis = new Swoole\Coroutine\Redis();
$res = $redis->connect('127.0.0.1', 6379);
if ($res == false) {
$response->end("redis connect fail!");
return;
}
$pool->push($redis);
$count++;
}
$redis = $pool->pop();
$ret = $redis->set('key', 'value');
$response->end("swoole response is ok, count = $count, result=" . var_export($ret, true));
$pool->push($redis);
}); $server->start();

此连接池代码也可用于其他协程客户端包括MySQL、HttpClient、TCPClient等。

协程没办法像异步回调程序一样可以对请求进行排队,然后通过事件驱动触发,没办法等到资源池可用。因此不太方便限制连接的数量。生产环境建议对连接池最大值做限制,操作最大连接数后,要拒绝客户端发起新的请求。

if (count($pool) == 0) {
if ($count > 100) {
$response->status(500);
$response->end("<h1>连接池已满,无法提供服务,请稍后重试</h1>");
}
}

转载至:https://my.oschina.net/matyhtf/blog/818339

Swoole2.0协程客户端连接池的实现的更多相关文章

  1. Redis客户端连接池

    使用场景 对于一些大对象,或者初始化过程较长的可复用的对象,我们如果每次都new对象出来,那么意味着会耗费大量的时间. 我们可以将这些对象缓存起来,当接口调用完毕后,不是销毁对象,当下次使用的时候,直 ...

  2. 由浅入深了解Thrift之客户端连接池化续

    前文<由浅入深了解Thrift之客户端连接池化>中我们已经实现了服务调用端 连接的池化,实现的过于简陋,离实际的项目运用还很遥远.本文将在进一步改造,主要是两方面:1.服务端如何注册多个服 ...

  3. 用Swoole4 打造高并发的PHP协程Mysql连接池

    码云代码仓库:https://gitee.com/tanjiajun/MysqlPool 代码仓库:https://github.com/asbectJ/swoole4.git 前言 在写这篇文章之前 ...

  4. (day31) Event+协程+进程/线程池

    目录 昨日回顾 GIL全局解释器锁 计算密集型和IO密集型 死锁现象 递归锁 信号量 线程队列 FOFI队列 LIFO队列 优先级队列 今日内容 Event事件 线程池与进程池 异步提交和回调函数 协 ...

  5. Python的异步编程[0] -> 协程[1] -> 使用协程建立自己的异步非阻塞模型

    使用协程建立自己的异步非阻塞模型 接下来例子中,将使用纯粹的Python编码搭建一个异步模型,相当于自己构建的一个asyncio模块,这也许能对asyncio模块底层实现的理解有更大的帮助.主要参考为 ...

  6. Python的异步编程[0] -> 协程[0] -> 协程和 async / await

    协程 / Coroutine 目录 生产者消费者模型 从生成器到异步协程– async/await 协程是在一个线程执行过程中可以在一个子程序的预定或者随机位置中断,然后转而执行别的子程序,在适当的时 ...

  7. 由浅入深了解Thrift之客户端连接池化

    一.问题描述 在上一篇<由浅入深了解Thrift之服务模型和序列化机制>文章中,我们已经了解了thrift的基本架构和网络服务模型的优缺点.如今的互联网圈中,RPC服务化的思想如火如荼.我 ...

  8. thrift - C#(CSharp)客户端连接池(ConnectionPool)

      调用示例:   var tran = ThriftPool.Instance().BorrowInstance(); TProtocol protocol = new TBinaryProtoco ...

  9. Python3 与 C# 并发编程之~ 协程篇

      3.协程篇¶ 去年微信公众号就陆陆续续发布了,我一直以为博客也汇总同步了,这几天有朋友说一直没找到,遂发现,的确是漏了,所以补上一篇 在线预览:https://github.lesschina.c ...

随机推荐

  1. C#细说多线程(上)

    本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发.其中委托的BeginInvoke方法以及回调函数最为常用.而 I/O线程可能容易遭 ...

  2. The type org.springframework.context.support.AbstractApplicationContext cannot be resolved

    在 myeclipse中,使用 jdk6和7,并使用 spring-framework-5.0.2.RELEASE 时,编写代码: import org.springframework.context ...

  3. 通过BeanFactoryPostProcessor来获取bean

    一.现在我们很多时候都在spring的容器中,进行bean的提取和操作,但是配置里面首先需要扫描相应的包来实现相关bean的注入 但是问题来了.如果我们在另外一个线程需要用的时候,并且没有配置扫描该类 ...

  4. jsp中 RequestDispatcher接口的两种跳转:forward()和include()

    在web程序中,经常是由多个Servlet来完成请求.RequestDispatcher接口就是为了多个Servlet之间的调整而实现的.该接口可以用httpSerbletRequest的getReq ...

  5. 九jQuery源码解析之.each()

    jQuery中存在两个each方法都是用于遍历的, 一个是对jQuery对象集合使用.each(),用于遍历这个集合; .each(function(index,element)) 还有一个是扩展jQ ...

  6. 整体读入cmd结果,而不是分行读入,效率极高

    public static long GetDirectorySize(string path) { long res = 0; System.Diagnostics.Process p = new ...

  7. python3.6编程第一课画个五角星

    使用的是海龟图库  turtle import turtle turtle.forward(100) turtle.right(144) turtle.forward(100) turtle.righ ...

  8. Windows 2008配置iis+Php+Mysql

    windows 2008 与 windows 2003 区别在于前者是iis7,后者是iis6.两个系统下配置Iis+Php+Mysql+Zend Optimizer+GD库+Phpmyadmin基本 ...

  9. 4 ways to pass parameter from JSF page to backing bean

    As i know,there are 4 ways to pass a parameter value from JSF page to backing bean : Method expressi ...

  10. Halcon中二维码解析函数解码率和时长的优化方法

    Halcon中条码解析函数包容多种条码类型且简单强大.现有的‘Data Matrix ECC 200’.‘QR Code’和‘PDF417’等广泛使用的条码均能解析.简单是通过默认参数即可对多种条码进 ...