Loading

php8.1引入的新特性 Fiber【纤程】

php8.1 引入的新特性 Fiber【纤程】是一种轻量级的协程实现,它允许在一个线程内实现非常高效的多任务处理。以下是 Fiber 的一些核心特性和基本用法:

一:Fiber 的核心特性:

  1. 非阻塞:Fiber 允许在函数执行过程中暂停恢复,而无需阻塞主线程,从而管理并发操作。
  2. 可暂停与恢复:在代码执行中,可以随时暂停当前 Fiber 的运行,并在稍后恢复。
  3. 独立栈:每个 Fiber 拥有独立的栈空间,不会影响其他 Fiber 或主线程的运行。

二:Fiber 的基本用法:

Fiber 可以通过 Fiber 类来创建和管理。以下是 Fiber 的一些基本操作:

  • 创建 Fiber:通过 new Fiber(callable $callback) 创建一个新的 Fiber 实例,其中 $callback 是一个可调用的函数或闭包。
  • 启动 Fiber:使用 Fiber::start() 方法启动 Fiber,该方法会执行 Fiber 直到遇到第一个 Fiber::suspend() 调用。
  • 暂停 Fiber:在 Fiber 内部,可以使用 Fiber::suspend(mixed $value = null) 方法暂停执行,并可选地返回一个值给外部。
  • 恢复 Fiber:使用 Fiber::resume(mixed $value = null) 方法恢复 Fiber 的执行,并可选地传递一个值给 Fiber。
  • 抛出异常:可以使用 Fiber::throw(Throwable $exception) 向 Fiber 抛出一个异常以恢复其执行。

案例:

<?php
$fiber = new Fiber(function (): void {
    echo 'fiber is start now ' . PHP_EOL;
    // 使纤程暂停,并抛出值 ‘suspend value’,可以被外部接收
    $value = Fiber::suspend('suspend value'); // 接收到 first
    echo 'fiber is resume now ' . PHP_EOL;
    // 第二次暂停
    $value = Fiber::suspend("the second time"); // 接收到 second
    echo 'fiber is finish now ' . PHP_EOL;
});

// 纤程开始执行,并且拿到暂停时抛出的值
echo "启动 Fiber...\n";
$result = $fiber->start(); // fiber is start now
echo "Fiber 暂停时返回:$result\n"; // Fiber 暂停时返回:suspend value
echo "恢复 Fiber...\n";
$fiber->resume('恢复时的传递值'); // fiber is resume now

//输出结果
启动 Fiber...
fiber is start now
Fiber 暂停时返回:suspend value
恢复 Fiber...
fiber is resume now
fiber is finish now

 

posted @ 2024-12-05 12:17  Carvers  阅读(540)  评论(0)    收藏  举报