swoole(6)Task异步任务
一:什么是task进程?
task进程是独立与worker进程的一组进程 ,他主要处理耗时较长的业务逻辑,并且不影响worker进程处理客户端的请求.worker进程通过task()函数把数据投递到Task进程去处理
开启task功能(task功能是默认关闭的 ,开启task功能需要满足2个条件)
- 配置task进程的数量(task_worker_num)
- 注册task的回掉函数onTask和onfinish
二:task设计流程
- worker进程中,我们调用对应的task()方法发送数据通知到task worker进程
- task worker进程会在onTask()回调中接收到这些数据,并进行处理
- 处理完会可以通过finish函数或直接return消息给worker进程
- 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)
} });
swoole(6)Task异步任务的更多相关文章
- Task异步编程
Task异步编程中,可以实现在等待耗时任务的同时,执行不依赖于该耗时任务结果的其他同步任务,提高效率. 1.Task异步编程方法签名及返回值: a) 签名有async 修饰符 b) 方法名以 Asyn ...
- 『审慎』.Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历
异步Task简单介绍 本标题有点 哗众取宠,各位都别介意(不排除个人技术能力问题) —— 接下来:我将会用一个小Demo 把 本文思想阐述清楚. .Net 4.0 就有了 Task 函数 —— 异步编 ...
- Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历
Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历 https://www.cnblogs.com/shuxiaolong/p/DotNet_Task_BUG.html 异步Task简单 ...
- C# 将 Begin 和 End 异步方法转 task 异步
在 .NET Framework 有两个不同的异步方法,一个是 Asynchronous Programming Model (APM) 另一个是 Task-based asynchronous pa ...
- c#中的Task异步编程
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/index翻译 1. 引入 Task异步 ...
- Task 异步小技巧
原文地址:Task 异步小技巧 - 一事冇诚 - 博客园 (cnblogs.com) async Task 语法糖出来后,异步编程变得非常简单,适合需要耗费较长时间的任务. 有些小伙伴使用后可能会非常 ...
- [Sw] 使用 Swoole Server task/协程 处理大数据量异步任务时注意
关于 Buffered Query 和 Unbuffered Query:http://www.php.net/manual/zh/mysqlinfo.concepts.buffering.php 对 ...
- Swoole 中使用异步任务
执行异步任务 (Task) # server.php $serv = new Swoole\Server("127.0.0.1", 9501); // 设置异步任务的工作进程数量 ...
- 新手浅谈C#Task异步编程
Task是微软在.net framework 4.0发布的新的异步编程的利器,当然4.5新增了async.await,这儿我们先说Task相关. 在实际编程中,我们用的较多的是Task.Task.Fa ...
随机推荐
- centos 7 安装及配置zabbix agent
一.在被监控主机上设置防火墙,允许zabbix-agent的10050端口通过 二.执行yum list |grep zabbix,找到zabbix的agent安装包并安装 三.在 /etc/zabb ...
- 手机APP例如抖音,让 people‘s 注意力集中到了 社会进化的 优胜部分 (优胜劣汰,什么是优) + 真善美,的 “美” , 促进了2极分化, 会产生强者俞强,弱者越弱,确实促进了信息的流通,传播了有用的东东 产生了独特的价值 而 如何 能计算出这些价值呢, 需要 数学 金融 财务 货币 量化吗
手机APP例如抖音,让 people‘s 注意力集中到了 社会进化的 优胜部分 (优胜劣汰,什么是优) + 真善美,的 “美” , 促进了2极分化, 会产生 ...
- i春秋web作业2.24
Web安全工程师(入门班) [全国线上入门班53期]课后作业 2020-2-24 DorinXL 分别尝试安装一个Windows和Linux操作系统 想要在虚拟机上装系统,首先需要下载对应的镜 ...
- 系统学习javaweb3----HTML语言3(结束)
说明:昨天是北方小年,需要做的事情有点多,需要祭灶,扫尘.包饺子,吃糖瓜儿,学习时间有点少,所以今天将两天的知识综合一下发出. 自我感觉:虽然感觉大致都了解了HTML语言,但是感觉自己面对程序还是无从 ...
- VLC查看日志的方法
最近使用VLC去播放rtsp网络串流总是失败,显示要查看日志,查看的方法: 进入VLC的GUI,点击视图,添加界面,添加调试窗口: 添加调试窗口,会弹出界面: 上面会有报错的提示. 大佬如果有其他的办 ...
- tomcat打印接口延迟时间
项目中有些页面时延不稳定,需要看每次接口调用时延,怎么看,有两种方法:一种是直接去catalina.out日志中看,一种是直接去localhost_access_log日志中看,第一种需要在代码中实现 ...
- 项目部署篇之三——安装tomcat7.0
1.下载tomcat 百度云下载 链接:https://pan.baidu.com/s/1UGPYHmR-1ehQRvdKGhSlyQ 提取码:3c0g 直接通过指令下载 wget http://mi ...
- CentOS-Apache服务(1)
title date tags layout CentOS6.5 配置Apache及多站点VirtualHost 2018-08-29 Centos6.5服务器搭建 post 1.安装httpd服务 ...
- [LC] 250. Count Univalue Subtrees
Given a binary tree, count the number of uni-value subtrees. A Uni-value subtree means all nodes of ...
- 86)PHP,PDO常用函数
(1) (2) 举例:假如我的sql语句有问题,那么我输出这两个函数所产生的信息. 还有一组函数: 分别是,开启事务,回滚事务,提交事务,判断是否处于事务中. errorInfo() 错误信 ...