phasync
Coroutines / Examples

Coroutines

Examples

Every example of this topic, with its output.

phasync#

Example 1
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#

Example 1
$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 ended

phasync::go#

Example 1
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#

Example 1
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#

Example 1
phasync::run(function () {
    phasync::go(function () { phasync::yield(); echo "yielded\n"; });
    phasync::go(function () { phasync::sleep(); echo "slept\n"; });
});   // slept, yielded

phasync::run#

Example 1
$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 ended

phasync::go#

Example 1
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#

Example 1
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#

Example 1
phasync::run(function () {
    phasync::go(function () { phasync::yield(); echo "yielded\n"; });
    phasync::go(function () { phasync::sleep(); echo "slept\n"; });
});   // slept, yielded

AggregateException#

Example 1
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#

Example 1
foreach ($e->getExceptions(PDOException::class) as $failure) {
    $logger->critical($failure->getMessage());
}

AggregateException::contains#

Example 1
if ($e->contains(PDOException::class)) {
    $db->reconnect();
}