别再混淆 PHP8.1 中纤程 Fibers 和协程 Coroutines 了 一文搞懂它们的区别

PHP 从早期那个只能写动态网页的简单脚本语言,发展到现在已经走了很远。PHP 8.1 的发布带来了一个特别令人兴奋的新功能:纤程(Fibers)—— 这个强大的特性为语言引入了结构化并发。

但有个问题:很多开发者还是会把协程纤程(Fibers)搞混,经常把它们当成一回事。虽然确实有相似的地方,但这两个概念有重要的区别。在设计异步或并发 PHP 应用时,搞清楚这些区别很重要。

让我们来详细分析一下。

原文链接-别再混淆 PHP8.1 中纤程 Fibers 和协程 Coroutines 了 一文搞懂它们的区别

什么是协程?

协程是一个通用的编程概念。你可以把它想象成一个特殊的函数,能够在某些地方暂停,然后稍后从暂停的地方继续执行。

在 PHP 中,协程通常通过生成器(yield)来实现。例如:

<?php

function coroutineExample() {
echo "Start\n";
yield;
echo "Resume\n";
} $coroutine = coroutineExample();
$coroutine->current(); // Start
$coroutine->next(); // Resume

这里,yield 允许函数暂停,将控制权返回给调用者,稍后再恢复。

这让协程在异步 I/O、数据管道和惰性求值方面特别有用。像 ReactPHP 和 Amp 这样的库底层就大量使用协程。

流程图:

┌─────────────┐
│ 开始函数 │
└──────┬──────┘


yield (暂停)


恢复执行


函数结束

什么是纤程 Fibers?

Fibers 是 PHP 8.1 中引入的一个更新、更底层的概念。它们是轻量级的执行上下文,可以手动控制暂停和恢复。

与协程不同,Fibers 不依赖 yield`。它们使用 Fiber API 来显式挂起:

<?php

$fiber = new Fiber(function (): void {
echo "Start\n";
Fiber::suspend("Paused");
echo "Resume\n";
});
$value = $fiber->start(); // Start
echo $value . "\n"; // Paused
$fiber->resume(); // Resume

纤程让你对执行流程有完全的控制权。它们让你能写出看起来像同步但实际是异步的代码,而且不会被生成器的各种限制绊住。

流程图:

┌─────────────┐
│ 纤程开始 │
└──────┬──────┘


挂起 (手动)


恢复 (手动)


再次挂起 (可选)


纤程完成

协程 vs Fibers:关键区别

方面 协程 Fibers
概念来源 高级语言特性 底层基础组件
实现方式 yield Fiber 类
使用场景 异步 I/O、管道、迭代 事件循环、异步框架
控制权 调用者通过生成器 API 控制 Fibers 完全控制执行上下文
恢复能力 只能在 yield 处暂停 可以在函数的任意点挂起
限制 不能返回到任意点 更灵活和强大

简而言之:

  • 协程(生成器)为你提供迭代和类异步模式的便捷语法。
  • Fibers提供了在 PHP 中构建强大异步运行时的基础组件。

为什么这对 PHP 开发者很重要?

Fibers出现之前,PHP 没有一种干净利落的方式来处理异步工作流,只能用那些看起来很丑的回调链或者各种生成器的奇技淫巧。

有了Fibers,像 Amp v3, ReactPHP, webman(2.0 版本支持 Fibers 驱动了) 这样的库现在能让异步代码看起来像同步代码一样:

<?php

function fetchData(): string {
// 假装这是异步 I/O
Fiber::suspend("Waiting for response...");
return "Data received!";
} $fiber = new Fiber(fn() => fetchData());
echo $fiber->start(); // Waiting for response...
echo $fiber->resume(); // Data received!

这使得 PHP 在并发服务器、实时应用和高性能 API 方面成为更强的竞争者。

总结

协程和 Fibers 是相关的,但不是同一个东西:

  • 协程(通过生成器)是暂停和恢复函数的模式。
  • Fibers是实现结构化并发和现代异步运行时的底层基础组件。

把协程想象成菜谱,Fibers 想象成食材。有了 Fibers 这个食材,你可以做出协程这道菜——但反过来就不行了。

如果你现在在用异步 PHP,搞清楚这些区别能帮你为项目选对工具和框架。

你怎么看——Fibers 会把 PHP 带入异步编程的新时代,还是协程依然会是大多数开发者的首选?

别再混淆 PHP8.1 中纤程 Fibers 和协程 Coroutines 了 一文搞懂它们的区别的更多相关文章

  1. 消息/事件, 同步/异步/协程, 并发/并行 协程与状态机 ——从python asyncio引发的集中学习

    我比较笨,只看用await asyncio.sleep(x)实现的例子,看再多,也还是不会. 已经在unity3d里用过coroutine了,也知道是“你执行一下,主动让出权限:我执行一下,主动让出权 ...

  2. Python的异步编程[0] -> 协程[1] -> 使用协程建立自己的异步非阻塞模型

    使用协程建立自己的异步非阻塞模型 接下来例子中,将使用纯粹的Python编码搭建一个异步模型,相当于自己构建的一个asyncio模块,这也许能对asyncio模块底层实现的理解有更大的帮助.主要参考为 ...

  3. python协程与异步协程

    在前面几个博客中我们一一对应解决了消费者消费的速度跟不上生产者,浪费我们大量的时间去等待的问题,在这里,针对业务逻辑比较耗时间的问题,我们还有除了多进程之外更优的解决方式,那就是协程和异步协程.在引入 ...

  4. Python协程与Go协程的区别二

    写在前面 世界是复杂的,每一种思想都是为了解决某些现实问题而简化成的模型,想解决就得先面对,面对就需要选择角度,角度决定了模型的质量, 喜欢此UP主汤质看本质的哲学科普,其中简洁又不失细节的介绍了人类 ...

  5. Python协程与JavaScript协程的对比

    前言 以前没怎么接触前端对JavaScript 的异步操作不了解,现在有了点了解一查,发现 python 和 JavaScript 的协程发展史简直就是一毛一样! 这里大致做下横向对比和总结,便于对这 ...

  6. Swoole 协程与 Go 协程的区别

    Swoole 协程与 Go 协程的区别 进程.线程.协程的概念 进程是什么? 进程就是应用程序的启动实例. 例如:打开一个软件,就是开启了一个进程. 进程拥有代码和打开的文件资源,数据资源,独立的内存 ...

  7. python 协程与go协程的区别

    进程.线程和协程 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定义: 操作系统能够进行运算调度的最小单位.它被包含在进 ...

  8. 不想再被鄙视?那就看进来! 一文搞懂Python2字符编码

    程序员都自视清高,觉得自己是创造者,经常鄙视不太懂技术的产品或者QA.可悲的是,程序员之间也相互鄙视,程序员的鄙视链流传甚广,作为一个Python程序员,自然最关心的是下面这幅图啦 我们项目组一值使用 ...

  9. Unity在协程内部停止协程自身后代码执行问题

    当在协程内部停止自身后,后面的代码块还会继续执行,直到遇到yield语句才会终止. 经测试:停止协程,意味着就是停止yield,所以在停止协程后,yield之后的语句也就不会执行了. 代码如下: us ...

  10. 使用context关闭协程以及协程中的协程

    package main import ( "sync" "context" "fmt" "time" ) var wg ...

随机推荐

  1. codemirror代码格式化

    上效果 代码 此处演示纯js版本,而切实5.x版本,最新版本6.x变化较大,不搞 <!DOCTYPE html> <html lang="en"> < ...

  2. PATCH请求REST API之MyDeltas.net

    PATCH是REST API支持的请求之一. REST API的请求常见的是GET和POST,其中PUT.DELETE和PATCH也很重要. PATCH表示部分更新,用POST当然可以代替,PATCH ...

  3. Codeforces Round #601 (Div. 2) ABC 题解

    A. Changing Volume 题意:每次可以加减5或2或1,问最少几步将a变成b. 思路:水题,贪心先搞把5取完再取2再取1. #include<iostream> #includ ...

  4. 日事清|管理驾驶舱,公司高管、PM必备观察工具

    场景介绍 01:一键切换「驾驶舱」高管视图 ● 驾驶舱适配办公室大屏.项目例会投屏展示.管理层统一回顾等场景: ● 每分钟自动更新数据,确保您看到的永远是最新的进度与状态: ● 今日在线人数.本周完成 ...

  5. 有哪些值得推荐的ESB厂商

    国内比较好的esb厂商有哪些 企业要想追求创新性转型,就必须要实现企业内部系统的互联互通以及与外部合作伙伴的高效协作,而企业服务总线(ESB)作为实现系统集成的关键技术,是企业发展路径上不可多得的助力 ...

  6. PostgreSQL 数据库中 ETL 操作的实战技巧

    在当今数字化时代,数据已成为企业最为宝贵的资产之一,而数据库则是存储与管理这些关键数据的核心.PostgreSQL 作为一款功能强大的开源关系型数据库,在众多领域都发挥着重要作用.今天,就让我们深入探 ...

  7. SciTech-AV-Video-DVP(Digital Video Processing)-CV/CG-ffmpeg-libavfilter:数字过滤器-

    This document describes filters, sources, and sinks provided by the libavfilter library. Filtergraph ...

  8. babylon.js 学习笔记(7)

    前面我们学习了如何画一堆房子(如下图),显然这单调的绿色大地,看上去效果并不好. babylon.js中,可以用图片模拟出地势高低不同的效果,比如下面这张图片: 颜色越深的地方,表示地势越低(即:盆地 ...

  9. 8种品牌PLC单片机实现自由格式协议串口通信从站视频教程

    8种品牌PLC单片机实现自由格式协议串口通信从站视频教程 一.罗克韦尔AB Micro850​系列PLC实现自由格式协议串口通信从站视频教程:罗克韦尔AB Micro850系列PLC做ASCII串口通 ...

  10. python2 & python3

    如果你的代码需要同时在 Python 2 和 Python 3 中运行, 使用:from __future__ import absolute_import, print_function