交互式
协程如何工作
两个协程高效地共享 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
}
});
执行时间线
CPU: 工作中0 ms
CPU
Coroutine 1
Coroutine 2
0255075100
速度
CPU 工作中CPU(协程 2)等待数据库等待网络
0 ms
总时间
0 ms
数据库等待
0 ms
网络等待
0 ms
节省的时间
协作式多任务
此可视化展示了两个协程如何高效共享 CPU。当一个等待数据库或网络的响应时,另一个执行有用的工作,任何线程都不会被阻塞。与顺序执行(162 ms)相比,协作式调度在 108 ms 内完成相同的工作。