TASK异步进程处理场景[通俗易懂]

TASK异步进程处理场景

大家好,又见面了,我是全栈君。

如消息队列,可以把复杂任务异步交给swoole的task进程处理。
大数据处理,如发送10000个EMAIL,可以异步交给swoole的task进程处理。

服务端应用程序

CLI 挂载启动服务端程序:php server.php

$serv = new swoole_server('127.0.0.1', 9501);

// 配置多少进程处理,传递给task函数是异步的
// 如果配置的是1,task会单进程方式把所有授予的任务依次处理完毕
$serv->set([
    'task_worker_num' => 1,
]);

$serv->on('Connect', function ($serv, $fd) {
    echo "new client connected." . PHP_EOL;
});

$serv->on('Receive', function ($serv, $fd, $fromId, $data) {
    echo "worker received data: {$data}" . PHP_EOL;

    // 投递一个任务到task进程中
    $serv->task($data);

    // 通知客户端server收到数据了
    $serv->send($fd, 'This is a message from server.');

    // 为了校验task是否是异步的,这里和task进程内都输出内容,看看谁先输出
    echo "worker continue run."  . PHP_EOL;
});

/**
 * $serv swoole_server
 * $taskId 投递的任务id,因为task进程是由worker进程发起,所以多worker多task下,该值可能会相同
 * $fromId 来自那个worker进程的id
 * $data 要投递的任务数据
 */
$serv->on('Task', function ($serv, $taskId, $fromId, $data) {
    echo "task start. --- from worker id: {$fromId}." . PHP_EOL;
    for ($i=0; $i < 100; $i++) {
        sleep(1);
        echo "task runing. --- {$i}" . PHP_EOL;
    }
    echo "task end." . PHP_EOL;
});

/**
 * 只有在task进程中调用了finish方法或者return了结果,才会触发finish
 */
$serv->on('Finish', function ($serv, $taskId, $data) {
    echo "finish received data '{$data}'" . PHP_EOL;
});

$serv->start();

客户端应用程序

客户端启动发送数据:php client.php

$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);

// 随后建立连接,连接失败直接退出并打印错误码
$client->connect('127.0.0.1', 9501) || exit("connect failed. Error: {$client->errCode}\n");
// 向服务端发送数据
$client->send("hello server.");
// 从服务端接收数据
$response = $client->recv();
// 输出接受到的数据
echo $response . PHP_EOL;

// 关闭连接
$client->close();

本篇总结:

  1. 没有耗时任务的情况下,worker直接运行,无需开启task

  2. 对于耗时的任务,可以在worker内调用task函数,把异步任务投递给task进程进行处理,task进程的数量取决于task_worker_num的配置

  3. task进程内可以选择调用finish方法或者return,来通知worker进程此任务已完成,worker进程会在onFinish回调中对task的执行结果进一步处理。如果worker进程不关心任务的结果,finish就不需要了。

TASK异步进程处理场景[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111887.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python小波变换 wavedec2函数 各个返回值详解「建议收藏」

    python小波变换 wavedec2函数 各个返回值详解「建议收藏」    网上找了好多文章都没有提到这个东西,没有说明wavedec2函数各个返回值究竟是什么意思   &nbs

    2022年7月3日
    33
  • 树莓派接口定义「建议收藏」

    树莓派接口定义「建议收藏」树莓派接口定义GPIODSI显示端口CSI摄像头接口MicroSD插槽HDMI/USB/Network接口MicroUSB电源接口/3.5mm音频输出接口GPIOGPIO(通用输入/输出接口)是树莓派重要的功能接口,它相当于Arduino上的GPIO引脚。这些引脚可以用于程序中读取电路中的电信号,也可以为控制电路提供电信号。使用GPIO时要非常小心,因为GPIO容易损坏,它使用…

    2022年6月1日
    54
  • 大数据建模与分析挖掘相关了解「建议收藏」

    大数据建模与分析挖掘相关了解「建议收藏」一.大数据总体架构与规划二.各类数据的采集三.相关名词的了解MP:MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念”Map(映射)“和”Reduce(归约)”,是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。当前的软件实现是指定一个Ma…

    2022年6月7日
    26
  • Ewebeditor最新漏洞及漏洞大全

    Ewebeditor最新漏洞及漏洞大全

    2021年12月7日
    41
  • Apache规则RewriteCond详解

    Apache规则RewriteCond详解
    Apache中RewriteCond语句对于我来说一直是个难点,多次试图去把它搞明白,都没有结构,这次我终于算大概知道它的意思了。 RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始、基础的功能,为了方便理解,下面来看看几个例子。
      RewriteEngineon
      RewriteCond %{HTTP_USER_AGENT

    2022年6月12日
    28
  • 【小制作】WIFI智能窗帘的制作[通俗易懂]

    【小制作】WIFI智能窗帘的制作[通俗易懂]自从之前做了个智能插排后,近期事忙,也就没时间搞新东西(其实是懒),最近老婆说要装个窗帘,突发奇想,要不装个智能窗帘算了,上某宝搜了一下,这玩意还挺贵,后来想想,算了,不如自己开发一个算了,顺便练练手,以后连上我之前开发的控制端,还可以统一控制。

    2022年6月23日
    55

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号