在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 中,Fiber、Swoole 和 Swow 都是不同的协程(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通过高效的协程调度系统实现并行,多个协程能够在同一个线程中并行执行,且协程之间通过事件循环管理。- 相较于
Swoole,Swow提供了更为现代的协程模型,适合高并发场景。
比较
| 特性 | Fiber | Swoole | Swow |
|---|---|---|---|
| 协程类型 | 协作式任务切换 | 异步事件驱动 + 协程 | 异步事件驱动 + 协程 |
| 并发模型 | 手动调度(需要开发者控制) | 自动管理协程,事件循环 | 自动管理协程,事件循环 |
| 异步 I/O | 不支持,需手动管理 I/O 操作 | 支持异步 I/O,内置事件循环 | 支持异步 I/O,内置事件循环 |
| 执行方式 | 单线程协作,任务手动暂停恢复 | 轻量级协程,基于事件循环的自动调度 | 轻量级协程,基于事件循环的自动调度 |
| 使用场景 | 适合轻量级并发任务 | 高并发网络服务器、长连接等应用场景 | 高并发网络服务器、长连接等应用场景 |
总结
- Fiber:是一种基于手动调度的协作式并发机制。它并不提供异步 I/O 支持,但通过任务切换提供了一定的并发能力。
- Swoole:提供了事件循环和协程支持,能够高效处理异步 I/O 和高并发任务。适用于需要并发处理 I/O 操作的场景。
- Swow:与
Swoole类似,但提供了更现代化的协程支持,并且在高并发处理上更加高效。
在需要并发的 PHP 应用中,如果你只需要轻量级的任务切换,Fiber 是合适的选择;如果你需要高效的异步 I/O 和大规模并发任务处理,Swoole 或 Swow 则是更好的选择。
相关文章:
在php中,Fiber、Swoole、Swow这3个协程都是如何并行运行的?
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
SQLite PRAGMA
SQLite的PRAGMA命令是一种特殊的命令,用于在SQLite环境中控制各种环境变量和状态标志。PRAGMA值可以被读取,也可以根据需求进行设置【0†source】。 PRAGMA命令的语法格式如下: 要查询当前的PRAGMA值,只需提供该PRAGMA的名字&am…...
使用python调用JIRA6 REST API及遇到的问题
JIRA认证方式简述 JIRA接口调用有两种认证方式访问Jira Rest API,基本认证⽅式(⽤户名和密码)和OAuth1认证方式。 基本认证⽅式:因为⽤户名和密码会被浏览器重复地请求和发送,即使采⽤ SSL/TLS 发送,也会有安全隐患,…...
基于STM32的智能电表可视化设计:ESP8266、AT指令集、python后端Flask(代码示例)
一、项目概述 随着智能家居的普及,智能电表作为家庭用电管理的重要工具,能够实时监测电流、电压及功率,并将数据传输至后台进行分析和可视化。本项目以STM32C8T6为核心,结合交流电压电流监测模块、ESP8266 Wi-Fi模块、OLED显示屏…...
图片和短信验证码(头条项目-06)
1 图形验证码接口设计 将后端⽣成的图⽚验证码存储在redis数据库2号库。 结构: {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" }//缓冲区大小(缓存5帧数据) #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…...
线程安全问题介绍
文章目录 **什么是线程安全?****为什么会出现线程安全问题?****线程安全问题的常见场景****如何解决线程安全问题?**1. **使用锁**2. **使用线程安全的数据结构**3. **原子操作**4. **使用volatile关键字**5. **线程本地存储**6. **避免死锁*…...
为AI聊天工具添加一个知识系统 之27 支持边缘计算设备的资源存储库及管理器
本文问题 现在我们回到 ONE/TWO/TREE 的资源存储库 的设计--用来指导 足以 支持 本项目(为AI聊天工具增加一套知识系统)的 核心能力 “语言处理” 中 最高难度系数的“自然语言处理” 中最具挑战性的“含糊性” 问题的解决。--因为足以解决 自然语言中最…...
初识verilog HDL
为什么选择用Verilog HDL开发FPGA??? 硬件描述语言(Hardware Descriptipon Lagnuage,HDL)通过硬件的方式来产生与之对应的真实的硬件电路,最终实现所设计的预期功能,其设计方法与软件…...
VS2015 + OpenCV + OnnxRuntime-Cpp + YOLOv8 部署
近期有个工作需求是进行 YOLOv8 模型的 C 部署,部署环境如下 系统:WindowsIDE:VS2015语言:COpenCV 4.5.0OnnxRuntime 1.15.1 0. 预训练模型保存为 .onnx 格式 假设已经有使用 ultralytics 库训练并保存为 .pt 格式的 YOLOv8 模型…...
Notepad++上NppFTP插件的安装和使用教程
一、NppFTP插件下载 图示是已经安装好了插件。 在搜索框里面搜NppFTP,一般情况下,自带的下载地址容易下载失败。这里准备了一个下载连接:Release v0.29.10 ashkulz/NppFTP GitHub 这里我下载的是x86版本 下载好后在nodepad的插件里面选择打…...
Kotlin | Android Provider 的实现案例
目标 使用 Android Room 实现持久化库。 代码 Kotlin 代码编写 DemoDatabase,在build生成 DemoDatabase_Impl 疑问 Provider的数据会存在设备吗? 内部存储: 当使用 Room 创建数据库(如 DemoDatabase),数据库文件通常…...
频域自适应空洞卷积FADC详解
定义与原理 在探讨FADC的核心策略之前,我们需要深入了解其定义和工作原理。FADC是一种创新性的卷积技术,旨在克服传统空洞卷积的局限性。其核心思想是从 频谱分析的角度 改进空洞卷积,通过 动态调整膨胀率 来平衡有效带宽和感受野大小。 FADC的工作原理可以从以下几个方面…...
Edge浏览器内置的截长图功能
Edge浏览器内置截图功能 近年来,Edge浏览器不断更新和完善,也提供了长截图功能。在Edge中,只需点击右上角的“...”,然后选择“网页捕获”->“捕获整页”,即可实现长截图。这一功能的简单易用,使其成为…...
GAN的应用
5、GAN的应用 GANs是一个强大的生成模型,它可以使用随机向量生成逼真的样本。我们既不需要知道明确的真实数据分布,也不需要任何数学假设。这些优点使得GANs被广泛应用于图像处理、计算机视觉、序列数据等领域。上图是基于GANs的实际应用场景对不同G…...
Math Reference Notes: 希腊字母表
希腊字母(Greek alphabet)是古希腊语使用的字母系统,也是西方字母系统的先驱之一,广泛应用于现代数学、物理学、工程学以及各种科学领域。希腊字母有24个字母,它们分为大写和小写两种形式。 1. Alpha (Α, α) 发音&a…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
