phasync
Waiting and timeouts / Examples

Waiting and timeouts

Examples

Every example of this topic, with its output.

phasync::sleep#

Example 1
phasync::run(function () {
    phasync::go(function () { phasync::sleep(0.2); echo "slow\n"; });
    phasync::go(function () { phasync::sleep(0.1); echo "fast\n"; });
});   // fast, slow

phasync::idle#

Example 1
phasync::run(function () {
    phasync::go(function () {           // keeps the loop busy for a while
        for ($i = 0; $i < 1000; ++$i) {
            phasync::yield();
        }
        echo "busy done\n";
    });
    phasync::idle();                    // returns only once the loop above has nothing left
    echo "idle\n";                       // after "busy done"
});

phasync::readable#

Example 1
phasync::run(function () {
    [$a, $b] = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
    stream_set_blocking($a, false);
    phasync::go(function () use ($b) { phasync::sleep(0.1); fwrite($b, "hello"); });

    echo fread(phasync::readable($a), 1024), "\n";   // hello, after 0.1 seconds
});

phasync::writable#

Example 1
stream_set_blocking($socket, false);
$written = fwrite(phasync::writable($socket), $data);   // may write less than all of $data

phasync::raiseFlag#

Example 1
phasync::run(function () {
    $ready = new stdClass();
    phasync::go(function () use ($ready) {
        phasync::awaitFlag($ready);
        echo "ready\n";
    });
    echo phasync::raiseFlag($ready), " woken\n";   // 1 woken
});

phasync::awaitFlag#

Example 1
$done = new stdClass();
phasync::go(function () use ($done) {
    phasync::sleep(0.1);
    phasync::raiseFlag($done);
});
phasync::awaitFlag($done, 1.0);   // returns after 0.1 seconds

IOException#

Example 1
phasync::run(function () {
    try {
        phasync::readable('not a stream');
    } catch (phasync\IOException $e) {
        echo $e->getMessage(), "\n";   // Not a valid stream resource
    }
});

SelectableInterface#

Example 1
phasync::run(function () {
    $group = new phasync\Util\WaitGroup();
    $group->add();
    phasync::go(function () use ($group) { phasync::sleep(0.01); $group->done(); });

    var_dump($group->isReady());   // false: one task is left
    $group->await();
    var_dump($group->isReady());   // true
});

TimeoutException#

Example 1
phasync::run(function () {
    $slow = phasync::go(fn () => phasync::sleep(1));

    try {
        phasync::await($slow, 0.01);
    } catch (phasync\TimeoutException $e) {
        echo "gave up\n";
    }
    phasync::cancel($slow);
});