返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >使用 spatie/async 库来写异步的 PHP 代码
  • 7
分享到

使用 spatie/async 库来写异步的 PHP 代码

asyncphp并发异步 2022-11-16 18:11:43 7人浏览 佚名
摘要

对于大多数用 PHP 编写的程序,它的唯一目的是执行由多个任务组成的简单进程,其中任务必须按顺序执行,如数据处理。我们总是不得不忍受同步编程的停止和等待。代码执行的同步风格被称为阻塞,这意味着任务将一个接一个地执行。那么,如果我们想要运行任

对于大多数用 PHP 编写的程序,它的唯一目的是执行由多个任务组成的简单进程,其中任务必须按顺序执行,如数据处理。我们总是不得不忍受同步编程的停止和等待。代码执行的同步风格被称为阻塞,这意味着任务将一个接一个地执行。那么,如果我们想要运行任务而不让它们相互阻塞,这意味着我们需要一个非阻塞进程,那该怎么办呢?这种方法需要在 php 中应用异步编程方法,这里的任务将在不相互依赖的情况下执行。

在 PHP 中实现非阻塞执行的一种常见方法是实现队列处理。任务被持久保存到 MysqlRedis、Amazon SQS 等传输系统中,该传输系统由后台 worker 检索并相应地执行,从而不会阻塞创建任务的主进程。Laravel 应用程序提供了一种队列机制,允许将任务(在本例中称为作业)推迟到稍后的时间进行处理。

另一种方法是并行运行所有定义的任务。我们从这种方法中知道的是,特定的任务完成后,它可以立即将控制权交还主进程,并承诺执行代码并在稍后通知我们结果(例如回调)。人们可能很少看到并行处理方法的用例;示例用例可能是执行图像处理并向某些外部服务发出 GET 请求。

让我们通过一个非常简单的用例来看看 PHP 中同步和异步(并行)流程之间的区别。

同步代码

foreach (range(1, 5) as $i) {
    $output = $i * 2;
    echo $output . "\n";
}

异步代码

use Spatie\Async\Pool;

$pool = Pool::create();

foreach (range(1, 5) as $i) {
    $pool[] = async(function () use ($i) {
       $output = $i * 2;
       return $output;
    })->then(function (int $output) {
       echo $output . "\n";
    });
}
await($pool);

当我们执行第一个代码时,我们将按以下顺序获得输出值:

2
4
6
8
10

重试执行,我们将获得与上面相同的顺序的输出。因此,每个乘法运算都要在下一个乘法运算之前等待执行。接下来,运行第二个代码块,让我们看看我们得到了什么。

6
10
2
8
4

第二次重试执行:

2
6
4
10
8

一个过程产生两个不同的结果。这正是我们使用异步方法所得到的结果。我们的小任务可以以一种互不阻塞的方式执行。每个乘法任务都是独立执行的,有些执行得比其他任务快,因此输出结果混乱无序。另外,请注意我们的异步函数作为 then 方法附加,该方法负责取回控制权,并且它接受回调函数作为其参数,该回调函数现在可以对接收到的输出执行额外的操作。

Spatie 的工作人员开发了这个很好的spacee/async包,它有助于并行执行任务。你可以通过 Composer 安装该包:

composer require spatie/async

该包提供了一种巧妙的方式来与创建的任务进行交互,这些任务将被并行执行。任务的事件监听器描述如下:

  • 当任务完成时再执行一次操作,是因为回调可以通过它的then方法来实现。

  • 当一个特定的任务使用catch方法抛出异常时,错误处理更容易控制。

  • 当一个任务没有完成其操作时,timeout方法允许人们处理这样的场景。

事件监听器与如下所示的任务挂钩:

$pool
    ->add(function () {
        // 要在并行进程中执行的任务
    })
    ->then(function ($output) {
        // 如果成功,进程或者你传递到队列的回调函数会返回`$output`。
    })
    ->catch(function ($exception) {
        // 当进程内抛出异常时,它会被捕获并传递到这里。
    })
    ->timeout(function () {
        // 哦,不! 一个过程花了太长时间才完成。 让我们做点什么吧
    })
;

要了解更多关于这个spacee/async包的信息,多多关注一下编程网的PHP其他的文章

--结束END--

本文标题: 使用 spatie/async 库来写异步的 PHP 代码

本文链接: https://lsjlt.com/news/173086.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用spatie/async库来写异步的PHP代码
    对于大多数用 PHP 编写的程序,它的唯一目的是执行由多个任务组成的简单进程,其中任务必须按顺序执行,如数据处理。我们总是不得不忍受同步编程的停止和等待。代码执行的同步风格被称为阻塞,这意味着任务将一个接一个地执行。那么,如果我们想要运行任...
    99+
    2022-06-16
    spatie async
  • 使用 spatie/async 库来写异步的 PHP 代码
    对于大多数用 PHP 编写的程序,它的唯一目的是执行由多个任务组成的简单进程,其中任务必须按顺序执行,如数据处理。我们总是不得不忍受同步编程的停止和等待。代码执行的同步风格被称为阻塞,这意味着任务将一个接一个地执行。那么,如果我们想要运行任...
    99+
    2022-11-16
    async php 并发 异步
  • 如何使用async/await来处理异步
    这篇文章将为大家详细讲解有关如何使用async/await来处理异步,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。先说一下async的用法,它作为一个关键字放到函数前面,...
    99+
    2024-04-02
  • 怎么用Async函数简化异步代码
    今天就跟大家聊聊有关怎么用Async函数简化异步代码,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Promise 在 JavaScript 上发布之...
    99+
    2024-04-02
  • C#中使用async和await实现异步Udp通讯的示例代码
    目录C/S架构客户端实现客户端主流程和实现客户端发送消息实现客户端监听消息实现服务器实现服务器主流程和实现服务器发送消息实现服务器监听消息实现总结在之前的C#版本中, 如果我们想要进...
    99+
    2024-04-02
  • 一段代码理解Python异步函数async的基本用法
    异步函数的使用规则 正常情况下我们的函数时串行的运行的,这里称之为主函数. 异步函数:与主函数并行运行. Python异步函数即async必须在普通函数的命名前加上async 示...
    99+
    2023-09-11
    python Powered by 金山文档
  • Spring中的如何使用@Async异步调用
    这篇文章主要介绍了Spring中的如何使用@Async异步调用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用@Async异步调用方法Async简介异步方法调用使用场景:处...
    99+
    2023-06-25
  • Spring中的使用@Async异步调用方法
    目录使用@Async异步调用方法Async简介给Spring的TaskExecutor去完成本次记录Async使用场景异步请求与异步调用的区别异步请求的实现SpringBoot中异步...
    99+
    2024-04-02
  • 关于java中@Async异步调用详细解析附代码
    目录前言1. @Async讲解2. 用法2.1 同步调用2.2 异步调用3. 自定义线程池前言 异步调用与同步调用 同步调用:顺序执行,通过调用返回结果再次执行下一个调用异步调用:通...
    99+
    2024-04-02
  • spring boot使用@Async异步注解的实现原理+源码
    1、java的大部分接口的方法都是串行执行的,但是有些业务场景是不需要同步返回结果的,可以把结果直接返回,具体业务异步执行,也有些业务接口是需要并行获取数据,最后把数据聚合在统一返回...
    99+
    2024-04-02
  • Vue 中 Promise 的then方法异步使用及async/await 异步使用总结
    目录1.Promise 的 then 方法使用  2. async await 使用3. async/await处理多个异步请求1.Promise 的 then 方法使用 ...
    99+
    2023-01-12
    Promise 的 then 方法使用 async await 使用 async/await处理多个异步请求
  • JS的异步函数async/await怎么使用
    这篇“JS的异步函数async/await怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JS的异步函数async/a...
    99+
    2023-07-05
  • 使用Node.js的async和await进行异步编程
    Node.JS官方文档:https://nodejs.dev/en/ 创建异步函数,并返回相关数值: 一般方式创建 function fn(){ return Promi...
    99+
    2023-05-18
    Node.js async和await Node.js 异步编程
  • PHP 中如何使用异常来提高代码的健壮性?
    使用异常处理可以增强 php 代码的健壮性,具体步骤如下:创建自定义异常类来映射特定错误。使用 throw 抛出异常以处理错误。使用 try-catch 语句捕获异常并进行适当处理。 ...
    99+
    2024-05-09
    异常处理 健壮性
  • 如何使用PHP代码来操作MySQL数据库
    PHP和MySQL的高度整合是开发网络应用程序的首选,因为大多数内容管理系统、电子商务网站和其他Web应用程序都需要与数据库进行交互。MySQL是最受欢迎的关系型数据库之一,可以使用PHP来操作MySQL。在一些情况下,你可能需要删除MyS...
    99+
    2023-05-14
  • spring boot使用@Async注解解决异步多线程入库的问题
    目录前言项目实况介绍第一种方式第二种方式这里有个坑!这里有两个坑!总结前言 在开发过程中,我们会遇到很多使用线程池的业务场景,例如定时任务使用的就是ScheduledThreadPo...
    99+
    2024-04-02
  • Node.js Async/Await实战解析:打造高效、可维护的异步代码
    Async/Await基本原理 Async/Await是ES7中的一个语法特性,它允许你在异步代码中使用同步编程的方式。Async/Await的基本原理是: 首先,你需要使用async关键字来定义一个异步函数。 在异步函数中,可以使用...
    99+
    2024-02-27
    Async/Await、Node.js、异步编程
  • JS中的async与await异步编程及await使用陷阱源码分析
    这篇“JS中的async与await异步编程及await使用陷阱源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JS中...
    99+
    2023-07-05
  • Spring @Async 的使用与实现的示例代码
    首先Spring AOP有两个重要的基础接口,Advisor和PointcutAdvisor,接口声明如下:Advisor接口声明:public interface Advisor { Advice getAdvice(); boole...
    99+
    2023-05-31
    spring @async
  • C#异步编程由浅入深(二)之Async/Await的使用
      考虑到直接讲实现一个类Task库思维有点跳跃,所以本节主要讲解Async/Await的本质作用(解决了什么问题),以及Async/Await的工作原理。实现一...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作