$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; });