Интерактивно

Как работают корутины

Две корутины эффективно делят процессорное время: пока одна ждёт базу данных или сеть, другая выполняет полезную работу.

Корутина 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
Корутина 1
Корутина 2
0255075100
Скорость
CPU работаетCPU (корутина 2)Ожидание БДОжидание сети
0 ms
Всего времени
0 ms
Ожидание БД
0 ms
Ожидание сети
0 ms
Сэкономлено

Кооперативная многозадачность

Визуализация показывает, как две корутины эффективно делят процессор. Пока одна ждёт ответа от базы данных или сети, другая выполняет полезную работу, и ни один поток не блокируется. По сравнению с последовательным выполнением (162 мс) кооперативное планирование справляется с той же работой за 108 мс.