8.1多任务处理中心
anlondon Lv6

8.1多任务处理中心

什么叫多任务处理中心?

php属于单线程应用,每次只能处理一个任务,然而当项目越来越复杂越来越庞大时,单线程就难以支撑庞大繁多的任务处理,而有的任务会因为网络/用户反应时间等原因,导致框架需要得到某些数据却迟迟得不到使得任务阻塞。

如1万个用户中一部分在付款等待付款结果,一部分在下单,一部分在等待短信通知,这些任务都会有一定的处理延迟,如果使用php框架处理,就会影响运行效率和用户体验。
而多任务处理中心则是独立于框架外,可以高效并同时处理多个任务的swoole模块(Swoole\Process)
如上述的例子,当框架遇到一些需要等待较久且使用频繁的功能时,可以将任务传递给Swoole的多任务处理中心,处理中心可以同时运行并根据需要返回结果,而php框架主体应用不会产生阻塞等待,可以更加专注于自己的任务

为什么需要多任务处理中心?

  • 在大流量高并发下为一部任务提供快速消费的能力
  • 实现业务逻辑的解耦,避免系统故障
  • 对人物做数据的轨迹、存储、挖掘、分析之类的工作

简单的实例

  • 模拟10个任务,每个任务需要一秒钟

    1
    2
    3
    4
    for($i=0;$i<10;$i++){
    sleep(1);
    echo '正在执行任务'.($i+1);
    }

    运行结果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [hime@192 swoole-sixstartedu]$ time php job/process.php 
    正在执行任务1
    正在执行任务2
    正在执行任务3
    正在执行任务4
    正在执行任务5
    正在执行任务6
    正在执行任务7
    正在执行任务8
    正在执行任务9
    正在执行任务10

    real 0m10.053s
    user 0m0.026s
    sys 0m0.009s
  • 使用Swoole 提供的进程管理模块模拟十个任务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    for($k=0;$k<10;$k++){
    $process = new Swoole\Process(function(){
    //子进程
    sleep(10);
    echo ':正在执行任务'.PHP_EOL;
    });
    $process->start();//启动进程,创建进程
    }
    //[hime@192 swoole-sixstartedu]$ time php job/process.php
    //:正在执行任务
    //:正在执行任务
    //:正在执行任务
    //:正在执行任务
    //:正在执行任务
    //:正在执行任务
    //:正在执行任务
    //:正在执行任务
    //:正在执行任务
    //:正在执行任务

    //real 0m10.347s
    //user 0m0.132s
    //sys 0m2.200s

    for循环制造了10个任务(sleep在实例process中,因此对for循环没有影响),并通过Process处理,10个任务同时进行,因此整体时间花费只在10s+
    从上面实例可以看出,swoole的进程处理是十分高效的,可以同时执行多个任务。
    p9:50分钟左右,讲解任务处理中心的功能分层(主进程,接收任务进程,执行任务进程,监听回收进程,进程间通信!

image

 Comments