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

在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 则是更好的选择。

相关文章:

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

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

SQLite PRAGMA

SQLite的PRAGMA命令是一种特殊的命令&#xff0c;用于在SQLite环境中控制各种环境变量和状态标志。PRAGMA值可以被读取&#xff0c;也可以根据需求进行设置【0†source】。 PRAGMA命令的语法格式如下&#xff1a; 要查询当前的PRAGMA值&#xff0c;只需提供该PRAGMA的名字&am…...

使用python调用JIRA6 REST API及遇到的问题

JIRA认证方式简述 JIRA接口调用有两种认证方式访问Jira Rest API&#xff0c;基本认证⽅式(⽤户名和密码)和OAuth1认证方式。 基本认证⽅式&#xff1a;因为⽤户名和密码会被浏览器重复地请求和发送&#xff0c;即使采⽤ SSL/TLS 发送&#xff0c;也会有安全隐患&#xff0c;…...

基于STM32的智能电表可视化设计:ESP8266、AT指令集、python后端Flask(代码示例)

一、项目概述 随着智能家居的普及&#xff0c;智能电表作为家庭用电管理的重要工具&#xff0c;能够实时监测电流、电压及功率&#xff0c;并将数据传输至后台进行分析和可视化。本项目以STM32C8T6为核心&#xff0c;结合交流电压电流监测模块、ESP8266 Wi-Fi模块、OLED显示屏…...

图片和短信验证码(头条项目-06)

1 图形验证码接口设计 将后端⽣成的图⽚验证码存储在redis数据库2号库。 结构&#xff1a; {img_uuid:0594} 1.1 创建验证码⼦应⽤ $ cd apps $ python ../../manage.py startapp verifications # 注册新应⽤ INSTALLED_APPS [django.contrib.admin,django.contrib.auth,…...

2501,wtl显示html

原文 在MFC程序中有专门封装的CHTMLView来显示超文本文件,如果在对话框中显示网页可用CDHTMLDialog,甚至可实现多页超文本向导风格的对话框,但是在WTL中却没有单独封装超文本的对应控件,这是因为COM组件的使用和编写本来就是ATL的强项,WTL扩展的是ATL欠缺的桌面应用的功能部分…...

嵌入式C语言:什么是指针?

目录 一、指针的基本概念 1.1. 定义指针 1.2. 赋值给指针 1.3. 解引用指针 1.4. 指针运算 1.5. 空指针 1.6. 函数参数 1.7. 数组和指针 1.8. 示例代码 二、指针在内存中的表示 2.1. 内存地址存储 2.2. 内存模型 2.3. 指针与硬件交互 2.4. 示例代码 三 、指针的重…...

解锁 KaiwuDB 数据库工程师,开启进阶之路

解锁 KaiwuDB 数据库工程师试题,开启进阶之路 一、KaiwuDB 数据库全方位洞察 (一)核心特性深度解析 原生分布式架构:摒弃传统集中式存储的局限,KaiwuDB 采用原生分布式架构,将数据分散存于多个节点。这不仅能有效避免单点故障风险,保障数据的高可用性,还能凭借并行处…...

ffmpeg7.0 aac转pcm

#pragma once #define __STDC_CONSTANT_MACROS #define _CRT_SECURE_NO_WARNINGSextern "C" { #include "libavcodec/avcodec.h" }//缓冲区大小&#xff08;缓存5帧数据&#xff09; #define AUDIO_INBUF_SIZE 40960 /*name depthu8 8s16 …...

【Pandas】pandas Series rdiv

Pandas2.2 Series Binary operator functions 方法描述Series.add()用于对两个 Series 进行逐元素加法运算Series.sub()用于对两个 Series 进行逐元素减法运算Series.mul()用于对两个 Series 进行逐元素乘法运算Series.div()用于对两个 Series 进行逐元素除法运算Series.true…...

线程安全问题介绍

文章目录 **什么是线程安全&#xff1f;****为什么会出现线程安全问题&#xff1f;****线程安全问题的常见场景****如何解决线程安全问题&#xff1f;**1. **使用锁**2. **使用线程安全的数据结构**3. **原子操作**4. **使用volatile关键字**5. **线程本地存储**6. **避免死锁*…...

为AI聊天工具添加一个知识系统 之27 支持边缘计算设备的资源存储库及管理器

本文问题 现在我们回到 ONE/TWO/TREE 的资源存储库 的设计--用来指导 足以 支持 本项目&#xff08;为AI聊天工具增加一套知识系统&#xff09;的 核心能力 “语言处理” 中 最高难度系数的“自然语言处理” 中最具挑战性的“含糊性” 问题的解决。--因为足以解决 自然语言中最…...

初识verilog HDL

为什么选择用Verilog HDL开发FPGA&#xff1f;&#xff1f;&#xff1f; 硬件描述语言&#xff08;Hardware Descriptipon Lagnuage&#xff0c;HDL&#xff09;通过硬件的方式来产生与之对应的真实的硬件电路&#xff0c;最终实现所设计的预期功能&#xff0c;其设计方法与软件…...

VS2015 + OpenCV + OnnxRuntime-Cpp + YOLOv8 部署

近期有个工作需求是进行 YOLOv8 模型的 C 部署&#xff0c;部署环境如下 系统&#xff1a;WindowsIDE&#xff1a;VS2015语言&#xff1a;COpenCV 4.5.0OnnxRuntime 1.15.1 0. 预训练模型保存为 .onnx 格式 假设已经有使用 ultralytics 库训练并保存为 .pt 格式的 YOLOv8 模型…...

Notepad++上NppFTP插件的安装和使用教程

一、NppFTP插件下载 图示是已经安装好了插件。 在搜索框里面搜NppFTP&#xff0c;一般情况下&#xff0c;自带的下载地址容易下载失败。这里准备了一个下载连接&#xff1a;Release v0.29.10 ashkulz/NppFTP GitHub 这里我下载的是x86版本 下载好后在nodepad的插件里面选择打…...

Kotlin | Android Provider 的实现案例

目标 使用 Android Room 实现持久化库。 代码 Kotlin 代码编写 DemoDatabase&#xff0c;在build生成 DemoDatabase_Impl 疑问 Provider的数据会存在设备吗&#xff1f; 内部存储: 当使用 Room 创建数据库&#xff08;如 DemoDatabase&#xff09;&#xff0c;数据库文件通常…...

频域自适应空洞卷积FADC详解

定义与原理 在探讨FADC的核心策略之前,我们需要深入了解其定义和工作原理。FADC是一种创新性的卷积技术,旨在克服传统空洞卷积的局限性。其核心思想是从 频谱分析的角度 改进空洞卷积,通过 动态调整膨胀率 来平衡有效带宽和感受野大小。 FADC的工作原理可以从以下几个方面…...

Edge浏览器内置的截长图功能

Edge浏览器内置截图功能 近年来&#xff0c;Edge浏览器不断更新和完善&#xff0c;也提供了长截图功能。在Edge中&#xff0c;只需点击右上角的“...”&#xff0c;然后选择“网页捕获”->“捕获整页”&#xff0c;即可实现长截图。这一功能的简单易用&#xff0c;使其成为…...

GAN的应用

5、GAN的应用 ​ GANs是一个强大的生成模型&#xff0c;它可以使用随机向量生成逼真的样本。我们既不需要知道明确的真实数据分布&#xff0c;也不需要任何数学假设。这些优点使得GANs被广泛应用于图像处理、计算机视觉、序列数据等领域。上图是基于GANs的实际应用场景对不同G…...

Math Reference Notes: 希腊字母表

希腊字母&#xff08;Greek alphabet&#xff09;是古希腊语使用的字母系统&#xff0c;也是西方字母系统的先驱之一&#xff0c;广泛应用于现代数学、物理学、工程学以及各种科学领域。希腊字母有24个字母&#xff0c;它们分为大写和小写两种形式。 1. Alpha (Α, α) 发音&a…...

App无辜躺枪?手把手教你搞定腾讯手机管家误报导致的应用商店下架

当合规应用遭遇误报下架&#xff1a;开发者系统性应对指南运动健康类应用被标记为金融诈骗软件&#xff1f;社交工具因"病毒风险"被各大商店紧急下架&#xff1f;这类看似荒谬的误报事件&#xff0c;正在成为中小开发团队的"无妄之灾"。某知名运动App开发团…...

从游戏引擎到仿真平台:手把手教你用AirSim+UE4搭建你的第一个无人机/自动驾驶仿真环境

从游戏引擎到仿真平台&#xff1a;构建AirSimUE4无人机与自动驾驶仿真环境实战指南当游戏引擎遇上机器人算法测试&#xff0c;会碰撞出怎样的火花&#xff1f;微软开源的AirSim项目将虚幻引擎&#xff08;Unreal Engine&#xff09;从游戏开发领域引入到自动驾驶和无人机研究的…...

阿波罗登月,不可能:读心术与影子叙事 ——不是向全世界展示登月,而是向全世界注射登月

阿波罗登月&#xff0c;不可能&#xff1a;读心术与影子叙事 ——不是向全世界展示登月&#xff0c;而是向全世界注射登月 Jianbing Zhu 1^{1}1 1^{1}1 ECT-OS-JiuHuaShan 文明实验室 ORCID: 0009-0006-8591-1891 DOI: 10.5281/zenodo.20373157 Email: ect-os-jiuhuashanzoho…...

开源ELM327 OBD-II适配器:从硬件设计到多协议固件实现全解析

1. 项目概述&#xff1a;开源ELM327 OBD适配器如果你对汽车诊断、数据监控或者嵌入式开发感兴趣&#xff0c;那么自己动手做一个OBD-II适配器绝对是个能让你学到很多东西的硬核项目。今天要聊的&#xff0c;就是一个完全开源的、基于NXP LPC1517微控制器的ELM327兼容OBD适配器。…...

基于晶体管逻辑的水箱自动控制器设计与实现

1. 项目概述&#xff1a;一个基于晶体管逻辑的自动水箱/湿度灌溉控制器 如果你也像我一样&#xff0c;曾经为家里的花园、阳台植物或者农村老家的储水塔手动开关水泵而烦恼&#xff0c;那么这个项目就是为你准备的。我设计并制作了一个完全自动化的水箱水位控制器&#xff0c;它…...

【C++】零基础入门 · 第 6 节:数组

上一节我们学习了函数,知道了如何把代码封装起来方便复用。但在实际编程中,你很快就会遇到一个问题:如果要存储 100 个学生的成绩,难道要定义 100 个变量吗?这显然不现实。数组就是 C++ 给出的答案——它让我们能用一个变量名管理一组相同类型的数据。 1. 为什么需要数组…...

Godot 2D随机地图三大静默故障:黑屏、穿墙、寻路失败的根源与修复

1. 为什么刚上手Godot做2D随机地图就总卡在“生成出来是黑的”“角色穿墙”“房间连不通”这三件事上&#xff1f;如果你是刚从Unity或GameMaker转来Godot&#xff0c;或者第一次用GDScript写程序逻辑的新手&#xff0c;大概率已经在2D随机地图生成这个环节反复摔过跟头——不是…...

终极音乐解锁指南:3步让加密音乐在任何设备自由播放

终极音乐解锁指南&#xff1a;3步让加密音乐在任何设备自由播放 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https:/…...

修复 PowerShell 7 下 conda activate 报错的指南

修复 PowerShell 7 下 conda activate 报错的指南 适用场景&#xff1a;升级到 PowerShell 7.x 后&#xff0c;conda activate 突然报错&#xff0c;但 Windows PowerShell 5.1 正常。 发布日期&#xff1a;2026-05-24 适用版本&#xff1a;conda 23.x PowerShell 7.x 一、问题…...

3步解决英雄联盟回放难题:ROFL-Player终极使用指南

3步解决英雄联盟回放难题&#xff1a;ROFL-Player终极使用指南 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 你是否曾经遇到过这样的烦…...