协程 / WaitGroup
最后更新于:2022-04-02 02:21:39
[TOC]
## 概述
```
协程是并发执行的
```
## 简单 demo
```
public function index(){
for ($i=0; $i < 10; $i++) {
go(function () use ($i){
echo "go ".$i;
\co::sleep(3);//在协程中 sleep,不影响主进程
//sleep(3); // 影响住进程,3 秒后执行下一个协程
});
}
$this->writeJson(200,"ok");
}
```
## 处理上下文
```
public function index(){
go(function (){
ContextManager::getInstance()->set('key','key in parent');
go(function (){
ContextManager::getInstance()->set('key','key in sub');
var_dump(ContextManager::getInstance()->get('key')." in");
});
\co::sleep(5);//不在主进程 sleep ,返回结果不会 sleep
var_dump(ContextManager::getInstance()->get('key')." out");
});
/**
* string(13) "key in sub in"
string(17) "key in parent out"
*/
$this->writeJson(200,"ok");
}
```
## WaitGroup
```
go(function (){
$ret = [];
$wait = new \EasySwoole\Component\WaitGroup();
$wait->add();
go(function ()use($wait,&$ret){
\co::sleep(0.1);
$ret[] = time();
$wait->done();
});
$wait->add();
go(function ()use($wait,&$ret){
\co::sleep(2);
$ret[] = time();
$wait->done();
});
$wait->wait();
var_dump($ret);
});
```
[TOC]
';