Coroutines
Examples
Every example of this topic, with its output.
phasync#
phasync::run(function () {
$a = phasync::go(function () { phasync::sleep(0.2); return 'a'; });
$b = phasync::go(function () { phasync::sleep(0.1); return 'b'; });
echo phasync::await($a), phasync::await($b), "\n"; // ab, after 0.2 seconds, not 0.3
});phasync::run#
$result = phasync::run(function () {
phasync::go(function () {
phasync::sleep(0.1);
echo "second\n";
});
echo "first\n";
return 'done';
});
echo "third: $result\n"; // run() returned after the coroutine endedphasync::go#
phasync::run(function () {
$fiber = phasync::go(function () {
echo "child\n";
phasync::sleep(0.1);
return 42;
});
echo "parent\n"; // after "child": it ran up to its first wait
echo phasync::await($fiber), "\n"; // 42
});phasync::await#
phasync::run(function () {
$fiber = phasync::go(function () { phasync::sleep(0.1); return 'result'; });
try {
phasync::await($fiber, 0.01);
} catch (phasync\TimeoutException) {
echo "not yet\n";
}
echo phasync::await($fiber), "\n"; // result
});phasync::yield#
phasync::run(function () {
phasync::go(function () { phasync::yield(); echo "yielded\n"; });
phasync::go(function () { phasync::sleep(); echo "slept\n"; });
}); // slept, yieldedphasync::run#
$result = phasync::run(function () {
phasync::go(function () {
phasync::sleep(0.1);
echo "second\n";
});
echo "first\n";
return 'done';
});
echo "third: $result\n"; // run() returned after the coroutine endedphasync::go#
phasync::run(function () {
$fiber = phasync::go(function () {
echo "child\n";
phasync::sleep(0.1);
return 42;
});
echo "parent\n"; // after "child": it ran up to its first wait
echo phasync::await($fiber), "\n"; // 42
});phasync::await#
phasync::run(function () {
$fiber = phasync::go(function () { phasync::sleep(0.1); return 'result'; });
try {
phasync::await($fiber, 0.01);
} catch (phasync\TimeoutException) {
echo "not yet\n";
}
echo phasync::await($fiber), "\n"; // result
});phasync::yield#
phasync::run(function () {
phasync::go(function () { phasync::yield(); echo "yielded\n"; });
phasync::go(function () { phasync::sleep(); echo "slept\n"; });
}); // slept, yieldedAggregateException#
try {
phasync::run(function () {
phasync::go(function () { phasync::sleep(0.01); throw new RuntimeException('cache down'); });
phasync::go(function () { phasync::sleep(0.01); throw new LogicException('bad query'); });
});
} catch (phasync\AggregateException $e) {
if ($e->contains(LogicException::class)) {
echo "a bug among ", count($e->getExceptions()), " failures\n";
}
}AggregateException::getExceptions#
foreach ($e->getExceptions(PDOException::class) as $failure) {
$logger->critical($failure->getMessage());
}AggregateException::contains#
if ($e->contains(PDOException::class)) {
$db->reconnect();
}