拿平时大家写的 for 循环举例。像 golang 你可以写两个 golang 每个里面各写一个循环同时输入,你可以看到输出是交替。在过去的php版本中,如果只开启一个 cli 写多个 for 循环,那么他的输出一定是顺序执行的。无法做到交叉输出(也就是无法在第一个循环中执行若干次后,让b再执行,b执行一段时间后,再让A执行)。

借助 fiber 我们也可以实现这种操作:交叉执行多任务

<?php
$t1    = false;
$t2    = false;
$reg   = [];
$reg[] = new \Fiber(function () use (&$t1) {for ($i = 1; $i < 10; $i++) {echo $i;echo PHP_EOL;\Fiber::suspend();}$t1 = true;
});$reg[] = new \Fiber(function () use (&$t2) {for ($i = 1; $i < 10; $i++) {echo $i;echo PHP_EOL;\Fiber::suspend();}$t2 = true;
});$startTag = true;
while (count($reg) > 1) {if ($startTag) foreach ($reg as $pI) {$pI->start();$startTag = false;}foreach ($reg as $pI) {$pI->resume();}if ($t1 === true && $t2 === true) {break;}
}

执行结果:

1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9

你甚至可以控制两个循环的执行频率,比如 第一个循环 执行3次后,第二个循环执行一次。代码如下

<?php
$reg = [];
$fId = 1;$reg[$fId] = new \Fiber(function () use (&$reg, $fId) {for ($i = 1; $i < 10; $i++) {echo $fId . ':' . $i;echo PHP_EOL;if ($i % 3 == 0) {\Fiber::suspend();}}unset($reg[$fId]);
});
$fId++;$reg[$fId] = new \Fiber(function () use (&$reg, $fId) {for ($i = 1; $i < 10; $i++) {echo $fId . ':' . $i;echo PHP_EOL;\Fiber::suspend();}unset($reg[$fId]);
});$startTag = true;
while (count($reg) > 0) {if ($startTag) foreach ($reg as $pI) {$pI->start();$startTag = false;}foreach ($reg as $pI) {$pI->resume();}
}

执行后:

1:1
1:2
1:3
2:1
1:4
1:5
1:6
2:2
1:7
1:8
1:9
2:3
2:4
2:5
2:6
2:7
2:8
2:9

通过消息通知完成

<?phpnamespace App\Command;use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;#[AsCommand(name: 'Sname',description: 'Add a short description for your command',
)]
class SnameCommand extends Command
{protected function configure(): void{$this->addArgument('arg1', InputArgument::OPTIONAL, 'Argument description')->addOption('option1', null, InputOption::VALUE_NONE, 'Option description');}protected function execute(InputInterface $input, OutputInterface $output): int{$t1  = false;$t2  = false;$reg = [];$fId = 1;$reg[] = new \Fiber(function () use ($fId) {for ($i = 1; $i < 10; $i++) {echo $fId . ':' . $i;echo PHP_EOL;if ($i % 3 == 0) {\Fiber::suspend(new SuspendData(Status::Running));}}\Fiber::suspend(new SuspendData(Status::Stop));});$fId++;$reg[] = new \Fiber(function () use ($fId) {for ($i = 1; $i < 10; $i++) {echo $fId . ':' . $i;echo PHP_EOL;\Fiber::suspend(new SuspendData(Status::Running));}\Fiber::suspend(new SuspendData(Status::Stop));});$startTag = true;while (count($reg) > 0) {if ($startTag) foreach ($reg as $pI) {$pI->start();$startTag = false;}foreach ($reg as $key => $pI) {$r = $pI->resume();if ($r->status === Status::Stop) {unset($reg[$key]);}}}return Command::SUCCESS;}
}class SuspendData
{public readonly Status $status;public function __construct($status){$this->status = $status;}
}enum Status
{case Stop;case Running;
}

PHP8.1 的 fiber相关推荐

  1. Chapter 2.PHP8.1 新特性fiber及原理浅析

    欢迎来到「我是真的狗杂谈世界」,关注不迷路 前言 很早就听说PHP8.1出了Fiber(又称纤程),但一直也没时间捣鼓它, 正好前段时间在整理PHP的新特性/功能,想看看有没有什么可以给日常开发带来便 ...

  2. php8支持哪些新特征,PHP8 新特性总结(一)

    摘要:PHP8已经正式发布3个多月了,这对PHP来说是一个重大版本,这个版本中有很多新功能,例如联合类型.命名参数.Match表达式.Nullsafe空安全运算符.类的反射... PHP8已经正式发布 ...

  3. php8的jit如何使用,PHP JIT 是什么?PHP8 新特性之 JIT 图文详解

    PHP8 alpha1已经在昨天发布,相信关于JIT是大家最关心的,PHP8 JIT是什么,又怎么用,又有什么要注意的,以及性能提升到底咋样? 首先,我们来看一张图: (右图有点错误就是,当JIT以后 ...

  4. react 日期怎么格式化_手写React的Fiber架构,深入理解其原理

    熟悉React的朋友都知道,React支持jsx语法,我们可以直接将HTML代码写到JS中间,然后渲染到页面上,我们写的HTML如果有更新的话,React还有虚拟DOM的对比,只更新变化的部分,而不重 ...

  5. React Fiber 数据结构揭秘

    此章节会通过两个 demo 来展示 Stack Reconciler 以及 Fiber Reconciler 的数据结构. 个人博客 首先用代码表示上图节点间的关系.比如 a1 节点下有 b1.b2. ...

  6. Fiber 为什么做并发IO的时候更加高效

    2019独角兽企业重金招聘Python工程师标准>>> Java 要在新的JDK版本中将支持协程,java loom project ,这个project的发起人正是Quasar的作 ...

  7. php 8 jit,PHP8正式版发布,带来了注解和JIT

    PHP8 正式版已经发布,它引入了一些重大变更,以及许多新特性和性能优化,包括命名参数.联合类型.注解.Constructor Property Promotion.match 表达式.nullsaf ...

  8. React16.2的fiber架构

    React16真是一天一改,如果现在不看,以后也很难看懂了. 在React16中,虽然也是通过JSX编译得到一个虚拟DOM对象,但对这些虚拟DOM对象的再加工则是经过翻天覆地的变化.我们需要追根溯底, ...

  9. Coroutine in Java - Quasar Fiber实现--转载

    转自 https://segmentfault.com/a/1190000006079389?from=groupmessage&isappinstalled=0 简介 说到协程(Corout ...

最新文章

  1. SIFT原理与源码分析 特征检测 描述子
  2. volumill插件下载网盘地址_IDM也可以下载磁力链接?(附资源)全程30Mb/s!你不知道的那些IDM妙用!...
  3. JSON Web Token - 在Web应用间安全地传递信息
  4. React-Native学习指南
  5. redis接口的二次封装
  6. html文件设置成mac屏保,Mac怎么设置屏幕保护?如何设置Mac屏幕保护程序?
  7. 跨浏览器开发:CSS代码的金科玉律
  8. Feign api调用方式
  9. 神经网络加载数据 自建数据集 官方数据集 pytorch 显示数据集
  10. No bean named 'cxf' is defined
  11. 五种MATLAB画圆方式程序
  12. 考研计算机网络必考考点,计算机专业考研计算机网络考点汇总
  13. 微信支付测试商户号开发必备(有效的)
  14. m1的docker-compose
  15. Android11.0(R) MTK6771 平板横屏方案修改(强制app横屏 + 开机logo/动画+关机充电横屏 + RecoveryUI 横屏)
  16. Android开发自定义短视频系统源码全局悬浮按钮
  17. 华为21级程序员月薪27万,你怎么看?
  18. 选型宝分享什么是没有基因缺陷的信息安全体系?
  19. 城市按A-Z json表
  20. 计算机语言怎么学,教你如何学习计算机编程语言

热门文章

  1. 尾置返回值类型decltype
  2. 如何提高自己的口才-02
  3. sql select 语句_学习SQL:SELECT语句
  4. XTU—1190 Game of Wuxing
  5. Fortran77-90-95入门(一)--Fortran语言的历史
  6. Python Turtle 小项目 4
  7. bitwarden密码管理和搭建服务说明
  8. 启动PE系统找不到计算机硬盘,进入PE后找不到电脑硬盘的原因及解决方法
  9. java的jvm和事务并发的关系_Java程序员岗面试总结
  10. 医学生英语四级和计算机二级,大学英语四级和计算机二级到底有没有用?看完这篇就懂了...