当前位置: 首页 > 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…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...