1
0
mirror of https://github.com/danog/amp.git synced 2024-12-02 17:37:50 +01:00
amp/examples/pipeline/fast-consumption.php
2020-09-25 12:32:37 -05:00

42 lines
1.1 KiB
PHP

#!/usr/bin/env php
<?php
require __DIR__ . '/../../vendor/autoload.php';
use Amp\AsyncGenerator;
use Amp\Delayed;
use function Amp\async;
use function Amp\await;
try {
/** @psalm-var AsyncGenerator<int, void, void> $pipeline */
$pipeline = new AsyncGenerator(function (): \Generator {
yield 1;
yield await(new Delayed(500, 2));
yield 3;
yield await(new Delayed(300, 4));
yield 5;
yield 6;
yield await(new Delayed(1000, 7));
yield 8;
yield 9;
yield await(new Delayed(600, 10));
});
// Pipeline consumer attempts to consume 11 values at once. Only 10 will be emitted.
$promises = [];
for ($i = 0; $i < 11 && ($promises[] = async(fn (): ?int => $pipeline->continue())); ++$i);
foreach ($promises as $key => $promise) {
if (null === $yielded = await($promise)) {
\printf("Async generator completed after yielding %d values\n", $key);
break;
}
\printf("Async generator yielded %d\n", $yielded);
}
} catch (\Exception $exception) {
\printf("Exception: %s\n", (string) $exception);
}