关于多线程多协程的疑惑
資深大佬 : xing393939 5
用 php 的 ptheads 扩展写了一个跑多线程的 demo,如下:
<?php class TestMysql extends Thread { public function run() { $conn = new mysqli('localhost', 'root', '', 'test'); $query = $conn->query("select sleep(1) as t" . $this->getThreadId()); $result = $query->fetch_assoc(); echo json_encode($result) . "rn"; } } $t = microtime(1); $t1 = new TestMysql(); $t2 = new TestMysql(); $t1->start(); $t2->start(); $t1->join(); $t2->join(); var_dump(microtime(1) - $t);
demo 的总运行时间是 1 秒,说明线程是并发执行的。我目前对底层知识了解不多,对比 swoole 的多协程开发,有一些疑惑,希望有人可以解惑下:
- 这个 demo 的 2 个线程用到了 cpu 的多核了吗,怎么去验证?
- 如果没有用到 cpu 的多核,说明线程遇到 io 阻塞的时候,会切换线程(同时 io 操作仍在执行,且执行完后会异步回调)。这样的话就和 swoole 的协程的处理思路是一样的了,只是 swoole 的协程对 io 阻塞的函数还有讲究,需要这些函数可以支持异步。swoole 为了实现这个,早期还专门针对 sleep/mysql/redis 等提供了支持异步的 sdk,后期通过底层的 hook 技术实现了这些原生函数一键协程支持。但是上面的多线程 demo 可以说明,多线程根本不需要多此一举。为什么协程需要这样处理呢?
大佬有話說 (8)