如何在swoole中使用task进程来处理耗时任务?

本文介绍了在swoole中如何利用task进程处理耗时任务,详细阐述了task进程的应用场景、worker与task的关系,以及如何配置和使用task,包括任务的切分与控制。同时强调了合理设置task_worker_num与处理速度的重要性,以避免worker进程阻塞。文章适合想要深入理解swoole task机制的PHP开发者阅读。
摘要由CSDN通过智能技术生成

我们知道,swoole中有两大进程,分别是 master 主进程和 manager 管理进程。

其中 master 主进程中会有一个主 reactor 线程和多个 reactor 线程,主要的作用就是用来维护TCP连接,处理网络IO,收发数据。

而 manager 管理进程,作用则是 fork 和管理 worker 和 task 进程。

worker 进程的作用是接收 reactor 线程传递的数据,并处理数据,返回处理结果给 reactor 线程。

task 进程的作用是处理一些相对耗时的任务,task 与 worker 进程是独立的,不会影响 worker 进程处理客户端的请求。

点此加入企鹅群

一、task 进程的应用场景:

1、相对耗时的邮件群发,比如某某活动,需要给100W用户发送活动邮件。

2、推送某些大V的动态,比如某大V发了条新消息,粉丝需要及时获取到该动态。

二、worker 与 task 的相互关系:

1、worker 进程中能过调用 task() 来投递任务,task 进程中 通过 onTask 事件来响应投递来的任务。

2、task 进程中 通过 直接返回 或 调用 finish() 来告诉 worker 进程任务处理完毕,worker 进程中 通过 onFinish 事件响应任务完成。

三、使用 task 的前题:

1、在 Server 中 配置 task_worker_num 数量。

2、设置 Server 的 onTask 和 onFinish 事件回调函数。

四、简单的使用task进行累加和的计算例子

<?php

$server = new swoole_server('0.0.0.0', 6666);
  
$server->set([
    'worker_num' => 2,
    'task_worker_num' => 16,
]);
  
$server->on('WorkerStart', function ($server, $worker_id) {
   
    //注意这里,我们通过taskworker来判断是task进程还是worker进程
    //需要在worker进程中调用task(),不然会报出警告
    //这里会执行两遍,因为我们设置了worker_num数为2
    if (!$server->taskworker) {
   
        echo '投递任务开始...', PHP_EOL;
        //投递32个累加计算任务给16个task进程
        for ($ix = 0; $ix < 32; $ix++) {
   
            //注意这里的投递是异步的
            $server->task([mt_rand(1, 100), mt_rand(1000, 9999)]);
        }
        echo '投递任务结束...', PHP_EOL;
    }
});
  
//server服务必须要有onReceive回调
$server->on('Receive'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值