swoole 协程 mysql 客户端等 进一步说明
官网文档已经说明了协程mysql客户端的使用方法
有几种情况
- 只有一个协程客户端,同步代码 异步执行
官网实例已经说明,如下 https://wiki.swoole.com/wiki/page/p-coroutine_realization.html - 多个协程客户端 同步代码 异步执行
其实就像默认的,他会按如上的顺序逐个执行 多个协程客户端 并发执行
并发执行主要涉及到两个方法setDefer延迟发送和recv收包
setDefer对下一行的io起作用,也就是不在那里进行收包,而是手动收包,从而达到并行效果
测试代码$http->on('request', function ($request, $response) use ($http, &$n) { if ($request->server['request_uri'] == '/favicon.ico') { $response->status(404); $response->end('404'); } $config = [ 'host' => '127.0.0.1', 'port' => 3306, 'user' => 'root', 'password' => 'root', 'database' => 'test', ]; $swoole_mysql1 = new \Swoole\Coroutine\MySQL(); $swoole_mysql1->connect($config); $stmt1 = $swoole_mysql1->prepare('select sleep(3) , uname from test where id = ?'); $swoole_mysql1->setDefer(); $ret1 = $stmt1->execute(array(1)); var_dump('ret1:' . time()); $swoole_mysql2 = new \Swoole\Coroutine\MySQL(); $swoole_mysql2->connect($config); $stmt2 = $swoole_mysql2->prepare('select sleep(1),uname from test where id = ?'); $swoole_mysql2->setDefer(); $ret2 = $stmt2->execute(array(2)); var_dump('ret2:' . time()); $res1 = $swoole_mysql1->recv(); var_dump($res1); $res2 = $swoole_mysql2->recv(); var_dump($res2); $response->end(time()); });
可以发现时间差只有3s,协程确实有效,swoole诚不欺我
注意要点
如上所示:setDefer应该用在具体查询的部分而不是连接的部分,否则会出现意外的错误
最后更新于 2018-05-08 08:09:48 并被添加「mysql swoole 协程 客户端等 进一步说明」标签,已有 739 位童鞋阅读过。
此处评论已关闭