当前位置: 首页 > article >正文

在php中,Fiber、Swoole、Swow这3个协程都是如何并行运行的?

文章精选推荐

1 JetBrains Ai assistant 编程工具让你的工作效率翻倍
2 Extra Icons:JetBrains IDE的图标增强神器
3 IDEA插件推荐-SequenceDiagram,自动生成时序图
4 BashSupport Pro 这个ides插件主要是用来干嘛的 ?
5 IDEA必装的插件:Spring Boot Helper的使用与功能特点
6 Ai assistant ,又是一个写代码神器
7 Cursor 设备ID修改器,你的Cursor又可以继续试用了

文章正文

在 PHP 中,FiberSwooleSwow 都是不同的协程(coroutine)实现,提供并行和并发执行的能力。它们在处理任务时有不同的工作方式和机制。下面,我们将分别解释这三者的并行执行方式,并通过代码实例进行演示。

1. PHP Fiber

Fiber 是 PHP 8.1 引入的一个特性,它允许在同一个线程中暂停和恢复执行流,提供了一种轻量级的协程实现。Fiber 并不自带事件循环或异步 I/O 的支持,更多是手动控制代码执行的暂停和恢复。它的并行是基于手动调度的。

示例:PHP Fiber 的并行执行
<?php

// 创建一个 Fiber,模拟并行任务
$fiber1 = new Fiber(function () {
    echo "Fiber 1 started\n";
    usleep(1000000);  // 模拟耗时操作
    echo "Fiber 1 completed\n";
});

$fiber2 = new Fiber(function () {
    echo "Fiber 2 started\n";
    usleep(1000000);  // 模拟耗时操作
    echo "Fiber 2 completed\n";
});

// 启动并手动调度 Fiber
$fiber1->start();
$fiber2->start();

// 暂停 Fiber,并继续执行
$fiber1->resume();
$fiber2->resume();
?>

输出(结果按执行顺序不固定):

Fiber 1 started
Fiber 2 started
Fiber 1 completed
Fiber 2 completed

解释

  • Fiber 运行在单线程中。我们手动调度每个 Fiber,通过 start() 启动,使用 resume() 来恢复执行。
  • Fiber 在执行时会允许其他 Fiber 中断并运行,实现了一种协作式的并行任务处理。
  • 但它不会自动进行并发操作,任务切换需要开发者手动控制。

2. Swoole

Swoole 是一个高性能的 PHP 扩展,它提供了基于事件循环和协程的并发编程能力。通过 Swoole,我们可以轻松实现异步 I/O 操作,并能够处理大量并发任务。Swoole 的协程是基于轻量级的线程,能够在一个进程中实现多任务并行。

示例:Swoole 协程的并行执行
<?php
use Swoole\Coroutine;

Coroutine\run(function () {
    // 启动两个并发任务
    go(function () {
        echo "Coroutine 1 started\n";
        usleep(1000000);  // 模拟 I/O 操作
        echo "Coroutine 1 completed\n";
    });

    go(function () {
        echo "Coroutine 2 started\n";
        usleep(1000000);  // 模拟 I/O 操作
        echo "Coroutine 2 completed\n";
    });
});
?>

输出(按执行顺序不同):

Coroutine 1 started
Coroutine 2 started
Coroutine 1 completed
Coroutine 2 completed

解释

  • Swoole 使用了事件循环(event loop)和 go 协程来启动并发任务。每个协程可以在 I/O 操作时自动挂起,允许其他任务继续执行。
  • go 函数启动协程,usleep 用来模拟阻塞操作。在协程内,PHP 会自动管理任务的挂起和恢复。
  • 不同协程间是并行执行的,Swoole 协程通过轻量级的线程实现并行性,且内部使用事件循环来处理任务。

3. Swow

Swow 是另一个高性能的 PHP 扩展,它与 Swoole 类似,提供协程支持,并且具有更现代的设计理念。Swow 提供了更高效的协程和事件循环支持,适合大规模并发的应用场景。Swow 的协程也能够通过轻量级线程实现并行执行。

示例:Swow 协程的并行执行
<?php
use Swow\Coroutine;

Coroutine::run(function () {
    // 启动两个并发任务
    Coroutine::create(function () {
        echo "Swow Coroutine 1 started\n";
        usleep(1000000);  // 模拟耗时操作
        echo "Swow Coroutine 1 completed\n";
    });

    Coroutine::create(function () {
        echo "Swow Coroutine 2 started\n";
        usleep(1000000);  // 模拟耗时操作
        echo "Swow Coroutine 2 completed\n";
    });
});
?>

输出(按执行顺序不同):

Swow Coroutine 1 started
Swow Coroutine 2 started
Swow Coroutine 1 completed
Swow Coroutine 2 completed

解释

  • Swow 的协程和 Swoole 类似,使用 Coroutine::create() 启动协程,并利用 usleep() 模拟阻塞操作。
  • Swow 通过高效的协程调度系统实现并行,多个协程能够在同一个线程中并行执行,且协程之间通过事件循环管理。
  • 相较于 SwooleSwow 提供了更为现代的协程模型,适合高并发场景。

比较

特性FiberSwooleSwow
协程类型协作式任务切换异步事件驱动 + 协程异步事件驱动 + 协程
并发模型手动调度(需要开发者控制)自动管理协程,事件循环自动管理协程,事件循环
异步 I/O不支持,需手动管理 I/O 操作支持异步 I/O,内置事件循环支持异步 I/O,内置事件循环
执行方式单线程协作,任务手动暂停恢复轻量级协程,基于事件循环的自动调度轻量级协程,基于事件循环的自动调度
使用场景适合轻量级并发任务高并发网络服务器、长连接等应用场景高并发网络服务器、长连接等应用场景

总结

  • Fiber:是一种基于手动调度的协作式并发机制。它并不提供异步 I/O 支持,但通过任务切换提供了一定的并发能力。
  • Swoole:提供了事件循环和协程支持,能够高效处理异步 I/O 和高并发任务。适用于需要并发处理 I/O 操作的场景。
  • Swow:与 Swoole 类似,但提供了更现代化的协程支持,并且在高并发处理上更加高效。

在需要并发的 PHP 应用中,如果你只需要轻量级的任务切换,Fiber 是合适的选择;如果你需要高效的异步 I/O 和大规模并发任务处理,SwooleSwow 则是更好的选择。


http://www.kler.cn/a/499839.html

相关文章:

  • 【HTML+CSS+JS+VUE】web前端教程-3-标题标签
  • Seata搭建
  • 解锁 C# 与 LiteDB 嵌入式 NoSQL 数据库
  • JavaScript的输出
  • 浅谈容灾技术方案详解
  • 2025年实训总结
  • 大语言模型的前沿探索:从理论到实践的深度剖析
  • 深入理解计算机系统——优化程序性能(一)
  • 类加载器和双亲委派
  • 深度学习与机器学习的关系和差别?
  • CMD批处理命令入门(4)——ping,ipconfig,arp,start,shutdown,taskkill
  • 【Unity3D】利用IJob、Burst优化处理切割物体
  • Redis 多路复用(Multiplexing)
  • git相关操作笔记
  • LLM的实验平台有哪些:快速搭建测试大语言模型
  • 【Unity-和WPF结合的优势】
  • Pixel 6a手机提示无法连接移动网络,打电话失败!
  • 太原理工大学软件设计与体系结构 --javaEE
  • 算法 -归并排序
  • Linux:操作系统简介