Interfaces Base

Awaitable

interface Async\Awaitable {}

Una interfaz marcadora para todos los objetos que pueden ser esperados. No contiene metodos – sirve para verificacion de tipos. Los objetos Awaitable pueden cambiar de estado multiples veces, lo que significa que son objetos multiple-shot.

Implementado por: Coroutine, Future, Channel, Timeout.

Completable

interface Async\Completable extends Async\Awaitable
{
    public function cancel(?AsyncCancellation $cancellation = null): void;
    public function isCompleted(): bool;
    public function isCancelled(): bool;
}

Extiende Awaitable. Los objetos Async\Completable cambian de estado solo una vez (one-shot).

Implementado por: Coroutine, Future, Timeout.

cancel()

Cancela el objeto. El parametro opcional $cancellation permite pasar un error de cancelacion especifico.

isCompleted()

Devuelve true si el objeto ya ha completado (exitosamente o con un error).

isCancelled()

Devuelve true si el objeto fue cancelado.

Timeout

final class Async\Timeout implements Async\Completable
{
    public function cancel(?AsyncCancellation $cancellation = null): void;
    public function isCompleted(): bool;
    public function isCancelled(): bool;
}

Un objeto de tiempo de espera. Se crea via la funcion timeout():

<?php
use function Async\timeout;
use function Async\await;

// Crear un tiempo de espera de 5 segundos
$timer = timeout(5000);

// Usar como limitador de espera
$result = await($coroutine, $timer);

Timeout no puede ser creado via new – solo a traves de timeout().

Cuando el tiempo de espera se activa, se lanza Async\TimeoutException.

Cancelar un Timeout

Si el tiempo de espera ya no es necesario, puede ser cancelado:

<?php
$timer = timeout(5000);

// ... la operacion se completo mas rapido
$timer->cancel(); // Liberar el temporizador

ScopeProvider

interface Async\ScopeProvider
{
    public function provideScope(): ?Scope;
}

Una interfaz que permite proporcionar un Scope para crear corrutinas. Se usa con spawn_with():

<?php
use Async\Scope;
use Async\ScopeProvider;
use function Async\spawn_with;

class RequestScope implements ScopeProvider
{
    private Scope $scope;

    public function __construct()
    {
        $this->scope = new Scope();
    }

    public function provideScope(): Scope
    {
        return $this->scope;
    }
}

$provider = new RequestScope();
$coroutine = spawn_with($provider, function() {
    echo "Trabajando en el Scope proporcionado\n";
});
?>

Si provideScope() devuelve null, la corrutina se crea en el Scope actual.

SpawnStrategy

interface Async\SpawnStrategy extends Async\ScopeProvider
{
    public function beforeCoroutineEnqueue(Coroutine $coroutine, Scope $scope): array;
    public function afterCoroutineEnqueue(Coroutine $coroutine, Scope $scope): void;
}

Extiende ScopeProvider con hooks de ciclo de vida – permite ejecutar codigo antes y despues de que una corrutina sea encolada.

beforeCoroutineEnqueue()

Se llama antes de que la corrutina sea anadida a la cola del planificador. Devuelve un array de parametros.

afterCoroutineEnqueue()

Se llama despues de que la corrutina sea anadida a la cola.

<?php
use Async\SpawnStrategy;
use Async\Coroutine;
use Async\Scope;
use function Async\spawn_with;

class LoggingStrategy implements SpawnStrategy
{
    private Scope $scope;

    public function __construct()
    {
        $this->scope = new Scope();
    }

    public function provideScope(): Scope
    {
        return $this->scope;
    }

    public function beforeCoroutineEnqueue(Coroutine $coroutine, Scope $scope): array
    {
        echo "Corrutina #{$coroutine->getId()} sera creada\n";
        return [];
    }

    public function afterCoroutineEnqueue(Coroutine $coroutine, Scope $scope): void
    {
        echo "Corrutina #{$coroutine->getId()} anadida a la cola\n";
    }
}

$strategy = new LoggingStrategy();
spawn_with($strategy, function() {
    echo "Ejecutando\n";
});
?>

CircuitBreaker y CircuitBreakerStrategy

Estas interfaces se describen en la documentacion de Async\Pool.

Vea Tambien