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

embedded/2025/1/13 2:07:27/

文章精选推荐

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"><?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"><?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"><?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.ppmy.cn/embedded/153431.html

相关文章

快速实现一个快递物流管理系统:实时更新与状态追踪

物流管理是电商、仓储和配送等行业的重要组成部分。随着电子商务的快速发展&#xff0c;快递物流的高效管理和实时状态更新变得尤为关键。本文将演示如何使用Node.js、Express、MongoDB等技术快速构建一个简单的快递物流管理系统&#xff0c;该系统支持快递订单的实时更新和追踪…

软考信安19~操作系统安全保护

1、操作系统安全概述 1.1、操作系统安全概念 操作系统的安全是指满足安全策略要求,具有相应的安全机制及安全功能,符合特定的安全标准,在一定约束条件下,能够抵御常见的网络安全威胁,保障自身的安全运行及资源安全。 《信息安全技术操作系统安全技术要求(GB/T 20272—2…

element ui前端小数计算精度丢失的问题如何解决?

文章目录 前言一、什么是精度丢失&#xff1f;产生精度丢失的原因如何避免或减少精度丢失的影响 二、实际项目开发实例举例以项目预算模块为例如何解决精度丢失 总结 前言 在《工程投标项目管理系统》项目开发中工程项目预算、成本管理、财务管理等模块的开发中不可避免的要和…

C++中的语句

文章目录 简单语句符合语句&#xff08;块&#xff09;switch语句break内部变量定义 while语句for语句do while语句goto语句try块和异常处理使用预处理器进行调试 简单语句 C中&#xff0c;大多数语句以分号结束。程序语句最简单的形式是空语句&#xff08;只有一个单独的分号…

Python Matplotlib 教程-Matplotlib 如何绘制常见图表

Python Matplotlib 如何绘制常见图表 Matplotlib 是 Python 中最流行的数据可视化库之一&#xff0c;提供了多种方式绘制各种图表&#xff0c;如折线图、柱状图、散点图、饼图等。本篇文章将从基础入门开始&#xff0c;逐步介绍如何使用 Matplotlib 绘制这些常见图表&#xff…

激活函数的实践选择

https://zhuanlan.zhihu.com/p/460177194https://zhuanlan.zhihu.com/p/460177194

Java设计模式 —— 【行为型模式】责任链模式(Chain-of-responsibility Pattern) 详解

文章目录 模式介绍优缺点适用场景模式结构案例实现 模式介绍 责任链模式又名职责链模式&#xff0c;它是一种对象行为的设计模式&#xff0c;为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链&…

【Rust自学】11.8. 忽略测试

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.8.1. 忽略某些测试&#xff0c;执行剩余测试 某些测试执行起来非常耗时&#xff0c;所以…