Csp 并发模式

当我们需要并发执行某些不相干的请求,并得到结果的时候,例如:

  1. $sql1->exec();
  2. $sql2->exec();
  3. $sql2->exec();

在以上的代码中,我们没办法最大的节约时间,因为sql语句都是顺序执行的,因此我们引入了Csp并发编程的概念。

示例代码

  1. go(function (){
  2. $channel = new \Swoole\Coroutine\Channel();
  3. go(function ()use($channel){
  4. //模拟执行sql
  5. \co::sleep(0.1);
  6. $channel->push(1);
  7. });
  8. go(function ()use($channel){
  9. //模拟执行sql
  10. \co::sleep(0.1);
  11. $channel->push(2);
  12. });
  13. go(function ()use($channel){
  14. //模拟执行sql
  15. \co::sleep(0.1);
  16. $channel->push(3);
  17. });
  18. $i = 3;
  19. while ($i--){
  20. var_dump($channel->pop());
  21. }
  22. });

::: tip 当然,在以上的代码中,我们没有充分的考虑超时等情况 :::

进一步封装

  1. go(function (){
  2. $csp = new \EasySwoole\Component\Csp();
  3. $csp->add('t1',function (){
  4. \co::sleep(0.1);
  5. return 't1 result';
  6. });
  7. $csp->add('t2',function (){
  8. \co::sleep(0.1);
  9. return 't2 result';
  10. });
  11. var_dump($csp->exec());
  12. });

::: warning exec方法提供了一个默认参数:超时时间(默认为5s),当调用$csp->exec()后,最长等待5s左右会返回结果。如果你在t2函数中co::sleep(6),那么5s后,返回的数据中不会包含t2函数的返回数据。 :::