Fiber 初体验

文章介绍了在PHP8中使用Fiber类进行协程编程的基本实现,包括创建协程、调度执行和挂起恢复的过程。示例展示了如何创建并运行两个并发执行的任务,同时指出了Fiber作为实验性特性的限制,如限制协程数量和异步IO操作的不便。
摘要由CSDN通过智能技术生成

记录 Fiber 初体验

class Coroutine
{
    private $fibers = [];
    private $scheduler;

    public function __construct()
    {
        $this->scheduler = new Scheduler;
    }

    public function create(callable $func, ...$args)
    {
        $fiber = new Fiber(function () use ($func, $args) {
            try {
                call_user_func($func, ...$args);
            } catch (Throwable $e) {
                echo 'Exception: ' . $e->getMessage() . PHP_EOL;
            }
        });
        $fiber->start();
        array_push($this->fibers, $fiber);
    }

    public function run()
    {

        while (!empty($this->fibers)) {
            $fiber = array_shift($this->fibers);
            if ($fiber->isStarted()) {
                $this->scheduler->add($fiber);
            }
        }
        while ($this->scheduler->isEmpty()) {
            $fiber = $this->scheduler->get();
            $fiber->resume();
            if ($fiber->isSuspended()) {
                $this->scheduler->add($fiber);
            }
        }
    }
}

class Scheduler
{
    private $queue = [];

    public function add(Fiber $fiber)
    {
        array_push($this->queue, $fiber);
    }

    public function get(): Fiber
    {
        $fiber = array_shift($this->queue);
        return $fiber;
    }

    public function isEmpty(): bool
    {
        return !empty($this->queue);
    }

}

// 使用示例
function task1() {
    for ($i = 0; $i <= 5; $i++) {
        echo "Task1: " . $i . PHP_EOL;
        Fiber::suspend();
    }
}

function task2() {
    for ($i = 0; $i < 10; $i++) {
        echo "Task2: " . $i . PHP_EOL;
        Fiber::suspend();
    }
}

$coroutine = new Coroutine;
$coroutine->create('task1');
$coroutine->create('task2');
$coroutine->run();

需要注意的是,在 PHP 8 中,Fiber 类为实验性特性,仍然存在一些限制和不足(如无法控制协程数量、无法轻松地进行异步 IO 操作等)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wsy321123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值