对系统底层了解的不多,想通过这个点学习一下。我先运行了两个例子
<?php
class Test extends Thread
{
public function run()
{
sleep(1);
var_dump($this->getThreadId());
}
}
$t = microtime(1);
$t1 = new Test();
$t2 = new Test();
$t1->start();
$t2->start();
$t1->join();
$t2->join();
var_dump(microtime(1) - $t);
<?php
go(function () {
Co::sleep(1);
var_dump(Co::getCid() . " " . microtime(1));
});
go(function () {
Co::sleep(1);
var_dump(Co::getCid() . " " . microtime(1));
});
var_dump("done");
这 2 个示例的总执行时间都是 1 秒。
根据我现在了解的知识,示例 2 是单进程单线程的,在协程环境中遇到 io 阻塞(Co::sleep),通过切换协程继续向下执行,因而实现了并发,这个还是很好理解的。示例 1 是单进程多线程的,即使是有 sleep 这样同步阻塞的任务,仍然可以并发执行,是因为用到了 cpu 的多核吗?怎么去验证呢?