对系统底层了解的不多,想通过这个点学习一下。我先运行了两个例子
<?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 的多核吗?怎么去验证呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.