一:什么是task进程?

task进程是独立与worker进程的一组进程  ,他主要处理耗时较长的业务逻辑,并且不影响worker进程处理客户端的请求.worker进程通过task()函数把数据投递到Task进程去处理

开启task功能(task功能是默认关闭的 ,开启task功能需要满足2个条件)

  1. 配置task进程的数量(task_worker_num)
  2. 注册task的回掉函数onTask和onfinish

二:task设计流程

  1. worker进程中,我们调用对应的task()方法发送数据通知到task worker进程
  2. task worker进程会在onTask()回调中接收到这些数据,并进行处理
  3. 处理完会可以通过finish函数或直接return消息给worker进程
  4. worker进程在onFinish()进程收到消息并进行处理

代码:

<?php
/**
* Created by PhpStorm.
* User: huahua
* Date: 2020/3/6
* Time: 上午10:09
*/ //基于第一个 TCP 服务器,只需要增加 onTask 和 onFinish2 个事件回调函数即可。
//另外需要设置 task 进程数量,可以根据任务的耗时和任务量配置适量的 task 进程。 $serv = new \Swoole\Server('127.0.0.1',9800); $serv->set([
'worker_num'=>2, //设置进程
//配置此参数后将会启用 task 功能。所以 Server 务必要注册 onTask、onFinish 2 个事件回调函数。如果没有注册,服务器程序将无法启动。
'task_worker_num' => 4, //配置 Task 进程的数量。
'task_ipc_mode'=>2,//设置 Task 进程与 Worker 进程之间通信的方式
]);
//监听连接进入事件
$serv->on('Connect', function ($serv, $fd) {
echo "Client: Connect.\n";
}); //监听数据接收事件
$serv->on('Receive', function ($serv, $fd, $from_id, $data) {
$data=['tid'=>time()];
$task_id = $serv->task($data);////投递到taskWorker进程组
echo "task id = {$task_id},from id = $from_id".PHP_EOL;
}); $serv->on('task',function ($serv, $task_id, $from_id, $data){
echo "task id = {$task_id},from id = $from_id,进程id =".posix_getpid().PHP_EOL;
echo '我是task任务';
$serv->finish("data -> ok");
}); $serv->on('finish',function ($serv, $task_id, $data){
echo "task id = {$task_id}".PHP_EOL;
});
//监听连接关闭事件
$serv->on('Close', function ($serv, $fd) {
echo "Client: Close.\n";
}); //启动服务器
$serv->start();

cli下运行结果:

$task_id不等于workerStart中的worker_id,而是swoole维护的任务自增长id
$from_id表示来自于哪个woker投递而来的任务,id等于worker_id值
$serv->worker_id等于workerStart中的worker_id, 此处是task_woker的id
$serv->worker_pid 此处是task_woker的进程pid

三:task任务切分

场景:假设有一台服务器专门处理前台投递的数据,利用简单的任务拆分,分配到相应的进程去处理

思路:

  • 1.将一个大的任务拆分成相应份数(是由$task_worker_num数量来确定)
  • 2.通过foreach循环将数据投递到指定的task进程,范围是(0-(task_worker_num-1))区间之内
  • 3.执行失败的任务,需要保留,重新投递执行(进程间通讯管道方式)
$server->on('receive',function (swoole_server $server, int $fd, int $reactor_id, string $data){
for ($i=0;$i<100;$i++){
$tasks[] =['id'=>$i,'msg'=>time()];
}
$count=count($tasks);
$data=array_chunk($tasks,ceil($count/3));
foreach ($data as $k=>$v){
$server->task($v,$k); //(0-task_woker_num-1)
} });

最新文章

  1. Unity3D游戏开发初探—3.初步了解U3D物理引擎
  2. 网页链接qq
  3. PERL/LEX/YACC技术实现文本解析--XML解析
  4. 基础篇之 Create Type
  5. Show Linux Package Sort By Size
  6. 第一章 : javaScript框架分类及主要功能
  7. 【Android车载系统 News | Tech 2】News 谷歌开发新车载系统!安卓Auto不是终点 2014-12-20
  8. Android:控件ListView列表项与适配器结合使用
  9. 1uboot移植要点[原创☆☆]
  10. 对进度条progressbar的调整
  11. AngularJS学习笔记filter
  12. paper资料
  13. php-cgi占用太多cpu资源而导致服务器响应过慢
  14. Java的URL类(一)
  15. LeetCode算法题-Intersection of Two Linked Lists(Java实现)
  16. NServiceBus消息重播
  17. netty学习总结(一)
  18. Asp.net MVC]Asp.net MVC5系列——在模型中添加
  19. python爬虫CSDN文章抓取
  20. egg.js-基于koa2的node.js入门

热门文章

  1. www、数组的equals、接口和抽象类、装箱拆箱、final赋值
  2. [LC] 289. Game of Life
  3. 吴裕雄--天生自然C语言开发:字符串
  4. 吴裕雄--天生自然C语言开发:数据类型
  5. yum安装与卸载软件常见命令
  6. linux中find,locate,whereis,which关系和用法
  7. git基本操作-长期维护
  8. python学习笔记(24)-类与对象
  9. Games
  10. git理论知识