Волокна представляют собой прерываемые функции с полным стеком. Волокна могут быть приостановлены из любого места в стеке вызовов, приостанавливая выполнение в волокне до тех пор, пока волокно не будет возобновлено в более позднее время.
Волокна приостанавливают весь стек выполнения, поэтому непосредственному вызывающему объекту функции не нужно менять способ вызова функции.
Выполнение может быть прервано в любом месте стека вызовов с помощью Fiber::suspend() (то есть вызов Fiber::suspend() может находиться в глубоко вложенной функции или вообще не существовать).
В отличие от генераторов без стека , у каждого волокна есть собственный стек вызовов, что позволяет приостанавливать их работу внутри глубоко вложенных вызовов функций. Функция, объявляющая точку прерывания (то есть вызывающая Fiber::suspend() ), не должна менять тип возвращаемого значения, в отличие от функции, использующей yield , которая должна возвращать экземпляр Generator .
Файберы могут быть приостановлены при вызове любой функции, включая те, которые вызываются из виртуальной машины PHP, например, функции, предоставленные для array_map() , или методы, вызываемые foreach для объекта Iterator .
После приостановки выполнение волокна может быть возобновлено с любым значением с помощью Fiber::resume() или путем создания исключения в волокне с помощью Fiber::throw() . Значение возвращается (или генерируется исключение) из Fiber::suspend() .
Пример #1 Базовое использование
<?php
$fiber = new Fiber(function (): void {
$value = Fiber::suspend('fiber');
echo "Value used to resume fiber: ", $value, PHP_EOL;
});
$value = $fiber->start();
echo "Value from fiber suspending: ", $value, PHP_EOL;
$fiber->resume('test');
?>
Приведенный выше пример выведет:
Ценность подвешивания волокна: волокно
Значение, используемое для возобновления оптоволокна: тест
0 комментариев