Skip to content

Latest commit

 

History

History
249 lines (202 loc) · 4.48 KB

2.协程的基本用法.md

File metadata and controls

249 lines (202 loc) · 4.48 KB

协程

创建协程并且马上运行

\Swow\Coroutine::run(function () {
    echo 1;
});

创建一个协程对象

$coroutine = new \Swow\Coroutine(function () {
    echo 1;
});

var_dump($coroutine);
//console 
object(Swow\Coroutine)#2 (4) {
  ["id"]=>
  int(2)
  ["state"]=>
  string(7) "waiting"
  ["switches"]=>
  int(0)
  ["elapsed"]=>
  string(3) "0ms"
}

这个时候创建的协程不会马上执行,需要用$coroutine->resume();唤醒协程,唤醒后会输出1;

$coroutine = new \Swow\Coroutine(function () {
    echo 1;
});

var_dump($coroutine);

$coroutine->resume();

object(Swow\Coroutine)#2 (4) {
  ["id"]=>
  int(2)
  ["state"]=>
  string(7) "waiting"
  ["switches"]=>
  int(0)
  ["elapsed"]=>
  string(3) "0ms"
}
1%  

如何获取当前协程对象

\Swow\Coroutine::getCurrent()

var_dump(\Swow\Coroutine::getCurrent());
//console

object(Swow\Coroutine)#1 (6) {
  ["id"]=>
  int(1)
  ["role"]=>
  string(4) "main"
  ["state"]=>
  string(7) "running"
  ["switches"]=>
  int(1)
  ["elapsed"]=>
  string(3) "0ms"
  ["trace"]=>
  string(178) "
#0 [internal function]: Swow\Coroutine->__debugInfo()
#1 /Users/heping/PhpWorkSpace/swow-cloud/swow/examples/coroutine/debug.php(14): var_dump(Object(Swow\Coroutine))
#2 {main}
"
}

通过API查看协程状态

关键字$coroutine->getStateName()查看协程当前状态(waiting,running,dead),$coroutine->isAvailable()查看协程是否可用

var_dump(\Swow\Coroutine::getCurrent());
$coroutine = new \Swow\Coroutine(function () {
    echo 1;

});

var_dump($coroutine->isAvailable());
var_dump($coroutine->getStateName());

$coroutine->resume();
object(Swow\Coroutine)#1 (6) {
  ["id"]=>
  int(1)
  ["role"]=>
  string(4) "main"
  ["state"]=>
  string(7) "running"
  ["switches"]=>
  int(1)
  ["elapsed"]=>
  string(3) "1ms"
  ["trace"]=>
  string(178) "
#0 [internal function]: Swow\Coroutine->__debugInfo()
#1 /Users/heping/PhpWorkSpace/swow-cloud/swow/examples/coroutine/debug.php(14): var_dump(Object(Swow\Coroutine))
#2 {main}
"
}
bool(true)
string(7) "waiting"
1%

获取协程ID

$coroutine->getId()

var_dump(\Swow\Coroutine::getCurrent()->getId());
int(1)

获取根线程

\Swow\Coroutine::getMain()

$coroutine = new \Swow\Coroutine(function () {
    var_dump(\Swow\Coroutine::getMain());

});

object(Swow\Coroutine)#1 (6) {
  ["id"]=>
  int(1)
  ["role"]=>
  string(4) "main"
  ["state"]=>
  string(7) "waiting"
  ["switches"]=>
  int(2)
  ["elapsed"]=>
  string(3) "3ms"
  ["trace"]=>
  string(116) "
#0 /Users/heping/PhpWorkSpace/swow-cloud/swow/examples/coroutine/debug.php(23): Swow\Coroutine->resume()
#1 {main}
"
}

获取上一个协程

$coroutine->getPrevious()

$coroutine = new \Swow\Coroutine(function () {
    var_dump(\Swow\Coroutine::getCurrent()->getPrevious());

});

object(Swow\Coroutine)#1 (6) {
  ["id"]=>
  int(1)
  ["role"]=>
  string(4) "main"
  ["state"]=>
  string(7) "waiting"
  ["switches"]=>
  int(2)
  ["elapsed"]=>
  string(3) "1ms"
  ["trace"]=>
  string(116) "
#0 /Users/heping/PhpWorkSpace/swow-cloud/swow/examples/coroutine/debug.php(23): Swow\Coroutine->resume()
#1 {main}
"
}

获取协程当前执行状态

$coroutine->getState()返回的是int类型,具体值代表的含义看常量STATE_WAITING,STATE_RUNNING,STATE_DEAD,可以配合$coroutine->getStateName()使用

var_dump(\Swow\Coroutine::getCurrent()->getState());
//int(2)

获取协程当前执行状态详情

$coroutine->getStateName()

var_dump(\Swow\Coroutine::getCurrent()->getStateName());
string(7) "running"

获取协程切换次数

$coroutine->getSwitches()

$c = Swow\Coroutine::getCurrent();
\Swow\Coroutine::run(function ()use($c){
    $c->yield();
});
\Swow\Coroutine::run(function ()use($c){
    $c->resume();
});
var_dump($c->getSwitches());
int(3)

获取协程开始,结束时间(时间戳)

$coroutine->getStartTime();$coroutine->getEndTime()

获取协程总用时

$coroutine->getElapsed();$coroutine->getElapsedAsString()

$c = Swow\Coroutine::getCurrent();
\Swow\Coroutine::run(function ()use($c){
    $c->yield();
});
\Swow\Coroutine::run(function ()use($c){
    $c->resume();
});
var_dump($c->getElapsed());
var_dump($c->getElapsedAsString());
int(14)
string(4) "15ms"

获取协程退出状态

$coroutine->getExitStatus()

检测协程是否可用

$coroutine->isAvailable(),$coroutine->isAlive()

检测协程是否正在执行

$coroutine->isExecuting()