$count=0;
go(function() use($count){
    for($i=1;$i<=3;$i++){
       $count=$count+$i;
    }
});
 
echo $count.PHP_EOL;

我们怎么在外部 输出$count值(思考下看视频解释);

 

认识管道:

 <?php
 use Swoole\Coroutine as co;
$chan=new co\Channel(1);
 go(function() use($chan){ //只负责 计算  cpu
     $count=0;
     for($i=1;$i<=3;$i++){
         $count=$count+$i;
         co::sleep(1);
     }
     $chan->push($count);

 });

 go(function() use($chan){  //只负责输出  IO
     echo $chan->pop().PHP_EOL;
 });

 

 

协程的切换、手动挂起协程

 

<?php
use Swoole\Coroutine as co;


$cid = go(function(){
    for($i=1;$i<=10;$i++){
        if($i == 6)
            co::yield();
        echo $i.PHP_EOL;
        co::sleep(0.1);
    }
});

go(function() use ($cid){
    for($i=1;$i<=10;$i++){
        echo 'a'.$i.PHP_EOL;
        co::sleep(0.1);
    }
    co::resume($cid);
});

 

[root@bogon swoole]# php7 ./class2.php
1
a1
2
a2
3
a3
a4
4
5
a5
a6
a7
a8
a9
a10
6
7
8
9
10

 

 使用多协程按顺序执行  

<?php
use Swoole\Coroutine as co;
function query(array $sqls){
    $mysql=new co\MySQL();
    $conn=$mysql->connect(['host' => '127.0.0.1', 'user' => 'root', 'password' => 'root', 'database' => 'test2',]);
    foreach($sqls as $sql){
        $statement=$mysql->prepare($sql);
        $rows=$statement->execute();
        foreach($rows as $row){
            foreach($row as $k=>$v){
                echo $k."=>".$v.";";
            }
        }
    }
    echo PHP_EOL;
}

go(function(){
    $chan=new co\Channel(2);

    go(function() use($chan){
        query(["select sleep(2)","select * from users where user_id=1"]);
        $chan->push(1);
    });
    go(function() use($chan){
        query(["select * from users where user_id=2"]);
        $chan->push(2);
    });

    for($i=0;$i<2;$i++){
        $chan->pop();
    }

    echo "done".PHP_EOL;
});

 

 模仿golang的WaitGroup

<?php
require_once "vendor/autoload.php";
use App\sync\WaitGroup;
use Swoole\Coroutine as co;
function query(array $sqls){
    $mysql=new co\MySQL();
    $conn=$mysql->connect(['host' => '192.168.29.1', 'user' => 'shenyi', 'password' => '123123', 'database' => 'test',]);
    foreach($sqls as $sql){
        $statement=$mysql->prepare($sql);
        $rows=$statement->execute();
        foreach($rows as $row){
            foreach($row as $k=>$v){
                echo $k."=>".$v.";";
            }
        }
    }
    echo PHP_EOL;
}

go(function(){
    $wg=new WaitGroup();
    $wg->Add(2);//设置协程的数量
    go(function() use($wg){
        query(["select sleep(2)","select * from users where user_id=1"]);
        $wg->Done();
    });
    go(function() use($wg){
        query(["select * from users where user_id=2"]);
        $wg->Done();
    });

   $wg->Wait();

    echo "done".PHP_EOL;
});
View Code

相关文章: