Csp 并发模式

使用 子协程(go) + 通道(channel) 实现 Csp 并发模式并发执行。

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

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

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

示例代码

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

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

进一步封装

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

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