当前位置: 首页 > 后端技术 > PHP

swoole学习笔记(四)异步任务task

时间:2023-03-29 21:56:47 PHP

目录初识Swoolecreateserver(上)createserver(下)异步任务task不断更新。..什么是异步任务?1、在不影响下一个事务的情况下,将当前任务异步下发到TaskWorker进程池中执行。举个栗子:在一些比较耗时的任务中,可以采用这种方案,无论从性能还是用户体验上,都比传统方式舒服很多。testweb_server.php$server=newswoole_websocket_server("0.0.0.0",8811);$server->set(['task_worker_num'=>2,//设置异步任务的worker进程数,以及适量的可根据任务的耗时和任务量配置任务流程。]);$server->on('message',function($server,$frame){echo'fdis:'.$frame->fd.'sent:'.$frame->data.'\n";//发布异步任务$task_id=$server->task($frame->fd);echo"我们继续访问\n";});$server->on('task',function($server,$task_id,$from_id,$data){for($i=1;$i<=5;$i++){sleep(2);//中断2秒echo'taskidis:'.$task_id.'tocompletethetask'.$i."/5'stask\n";}$server->finish($data);});//处理异步任务的结果$server->on('finish',function($server,$task_id,$data){echo'fdis:'.$data.',taskis:'.$task_id.'任务完成时间为:'.date('Y-m-dH:i:s')."\n";});$server->start();客户端js代码varurl='ws://你的ip地址:8811';varwebsocket=newWebSocket(url);websocket.onopen=function(evt){console.log("ConnectedtoWebSocketserver.");websocket.send('Client:Connectionestablishedsuccessfully');};websocket.onclose=function(evt){console.log("Disconnected");};websocket.onmessage=函数(evt){console.log('从服务器获取数据:'+evt.data);};websocket.onerror=function(evt,e){console.log('发生错误:'+evt.data);};我们先打开web_server,然后通过浏览器打开两个客户端,这里为了区别流程,两个客户端的打开时间相差几秒。这个时候我打开终端,重点是:结论所以我们得出了以下结论:1.Task可以作为一个进程在后台运行,不影响后续执行,这里是异步的2.可以设置多个task.如果一项任务被占用,则将使用另一项任务。3、task完成任务后,会空闲,可以被下一个client使用(本例不展示效果,有兴趣的可以测试一下)注意事项1.这个要注意数量任务,以防止性能过高。2、注意防止进程堵塞。阻塞的进程会消耗资源,很长时间不能被下一个客户端使用。3..exit/die是危险的,会导致Worker进程退出扩展swoole中的异步IO。读写文件,读写mysql,读写redis也类似异步IO。先返回结果,再进行IO。但是,这些应用大多是耗时较长但结果不影响程序的情况,例如:文章读取+1的同步过程是redis/mysql数据+1->显示文章,而异步过程就是直接展示文章,然后发送redis/mysql数据+1,这样就减少了子用户的等待时间,当然还有很多场景也是适用的。有兴趣的朋友可以继续研究documentio的部分,这里就不继续深究了。如果这篇文章对你有用,可以点赞或收藏。勉励~文档地址传送门:https://wiki.swoole.com/wiki/...推荐Singwa老师的视频教程:https://coding.imooc.com/clas...附上小弟的网址。.www.entercode.cn推广一波...