两个协程高效共享 CPU 时间

协程 1 — 用户处理 迭代: 0/3
$coro1 = spawn(function() {
$pdo = new PDO($dsn);
foreach ([1,2,3] as $id) {
$stmt = $pdo->prepare("SELECT * FROM users WHERE id=?");
$stmt->execute([$id]); // ⏳ 15ms
$user = $stmt->fetch();
processUser($user);
}
});
协程 2 — 日志 + 通知 迭代: 0/3
$coro2 = spawn(function() {
$pdo = new PDO($dsn);
$socket = fsockopen($host, 9000);
foreach (['login','click','logout'] as $e) {
$stmt = $pdo->prepare("INSERT INTO logs VALUES(?)");
$stmt->execute([$e]); // ⏳ 12ms
fwrite($socket, $e); // ⏳ 20ms
}
});
执行时间线 0 ms
协程 1 就绪
协程 2 就绪
0255075100ms
CPU:
等待中
CPU 工作中
等待数据库
等待网络
0 ms
总时间
0 ms
数据库等待
0 ms
网络等待
0 ms
节省时间

点击"播放"开始

此可视化展示了两个协程如何高效共享 CPU。 当一个协程等待数据库网络的响应时, 另一个协程可以进行有用的工作。这就是协作式多任务