Базові інтерфейси
Awaitable
interface Async\Awaitable {}
Маркерний інтерфейс для всіх об’єктів, які можна очікувати. Не містить методів – служить для перевірки типів.
Об’єкти Awaitable можуть змінювати стани кілька разів, тобто вони є multiple-shot об’єктами.
Реалізується: 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;
}
Розширює Awaitable. Об’єкти Async\Completable змінюють стан лише один раз (one-shot).
Реалізується: Coroutine, Future, Timeout.
cancel()
Скасовує об’єкт. Необов’язковий параметр $cancellation дозволяє передати конкретну помилку скасування.
isCompleted()
Повертає true, якщо об’єкт вже завершився (успішно або з помилкою).
isCancelled()
Повертає true, якщо об’єкт було скасовано.
Timeout
final class Async\Timeout implements Async\Completable
{
public function cancel(?AsyncCancellation $cancellation = null): void;
public function isCompleted(): bool;
public function isCancelled(): bool;
}
Об’єкт таймауту. Створюється через функцію timeout():
<?php
use function Async\timeout;
use function Async\await;
// Створюємо таймаут на 5 секунд
$timer = timeout(5000);
// Використовуємо як обмежувач очікування
$result = await($coroutine, $timer);
Timeout не можна створити через new – тільки через timeout().
Коли таймаут спрацьовує, кидається Async\TimeoutException.
Скасування таймауту
Якщо таймаут більше не потрібен, його можна скасувати:
<?php
$timer = timeout(5000);
// ... операція завершилась швидше
$timer->cancel(); // Звільняємо таймер
ScopeProvider
interface Async\ScopeProvider
{
public function provideScope(): ?Scope;
}
Інтерфейс, що дозволяє надавати Scope для створення корутин. Використовується з 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 "Working in the provided Scope\n";
});
?>
Якщо provideScope() повертає null, корутина створюється в поточному Scope.
SpawnStrategy
interface Async\SpawnStrategy extends Async\ScopeProvider
{
public function beforeCoroutineEnqueue(Coroutine $coroutine, Scope $scope): array;
public function afterCoroutineEnqueue(Coroutine $coroutine, Scope $scope): void;
}
Розширює ScopeProvider хуками життєвого циклу – дозволяє виконувати код до і після додавання корутини в чергу.
beforeCoroutineEnqueue()
Викликається до того, як корутина буде додана в чергу планувальника. Повертає масив параметрів.
afterCoroutineEnqueue()
Викликається після додавання корутини в чергу.
<?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 "Coroutine #{$coroutine->getId()} will be created\n";
return [];
}
public function afterCoroutineEnqueue(Coroutine $coroutine, Scope $scope): void
{
echo "Coroutine #{$coroutine->getId()} added to queue\n";
}
}
$strategy = new LoggingStrategy();
spawn_with($strategy, function() {
echo "Executing\n";
});
?>
CircuitBreaker та CircuitBreakerStrategy
Ці інтерфейси описані в документації Async\Pool.
Дивіться також
- Корутини – базова одиниця конкурентності
- Scope – управління часом життя корутин
- Future – обіцянка результату
- spawn_with() – запуск корутини з провайдером