热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

目录初识Swoole创建服务器(上)创建服务器(下)异步任务task持续更新中。。。什么是异步任务?1.把当前的任务异步投递到TaskWorker进程池中执行

目录

  • 初识Swoole
  • 创建服务器(上)
  • 创建服务器(下)
  • 异步任务task

持续更新中。。。

什么是异步任务?

1.把当前的任务异步投递到TaskWorker进程池中执行,不影响接下来的事务。
举个栗子:

clipboard.png

在一些需要耗时间长的任务可以采取这种方案
不管从性能的发挥还是用户体验都是比传统的方式舒服很多


测试

web_server.php

$server = new swoole_websocket_server("0.0.0.0", 8811);
$server->set(['task_worker_num' => 2,//设置异步任务的工作进程数量,可以根据任务的耗时和任务量配置适量的task进程。]
);$server->on('message', function ($server, $frame) {echo 'fd为: '.$frame->fd.'发送了:'.$frame->data."\n";//投递异步任务$task_id = $server->task($frame->fd);echo "我们继续访问\n";
});$server->on(&#39;task&#39;, function ($server, $task_id, $from_id,$data) {for ($i&#61;1; $i <&#61;5 ; $i&#43;&#43;) { sleep(2);//休息2秒echo &#39;taskid为:&#39;.$task_id.&#39;完成任务&#39;.$i."/5的任务了\n";}$server->finish($data);
});//处理异步任务的结果
$server->on(&#39;finish&#39;, function ($server, $task_id, $data) {echo &#39;fd为:&#39;.$data.&#39;,task为:&#39;.$task_id.&#39;任务完成的时间是:&#39;.date(&#39;Y-m-d H:i:s&#39;)."\n";
});$server->start();

客户端js代码

var url&#61;&#39;ws://你的ip地址:8811&#39;;var websocket &#61;new WebSocket(url);websocket.onopen &#61; function (evt) {console.log("Connected to WebSocket server.");websocket.send(&#39;客户端&#xff1a;建立链接成功&#39;);
};websocket.onclose &#61; function (evt) {console.log("Disconnected");
};websocket.onmessage &#61; function (evt) {console.log(&#39;Retrieved data from server: &#39; &#43; evt.data);
};websocket.onerror &#61; function (evt, e) {console.log(&#39;Error occured: &#39; &#43; evt.data);
};

我们先打开web_server&#xff0c;
然后通过浏览器打开2个客户端&#xff0c;这里为了区别进程&#xff0c;2个客户端打开的时间我是相差了几秒打开的

这个时候看终端&#xff0c;重点来了&#xff1a;

图片描述

结论

所以我们得出了以下的结论:
1.task可以作为进程在后台运行不影响后面的执行&#xff0c;这里是异步的
2.task可以设置多个&#xff0c;一个task被占用&#xff0c;就使用另一个&#xff0c;
3.task完成任务之后&#xff0c;它就会被闲置&#xff0c;可以给下个客户端使用&#xff08;本案例没有展示出效果&#xff0c;有兴趣可以test一下&#xff09;

注意的地方

1.这个要注意task的数目&#xff0c;防止开销过多的性能
2.注意防止进程的堵塞&#xff0c;阻塞的进程十分耗资源而已长期占用无法被下个客户端使用
3.exit/die是危险的&#xff0c;会导致Worker进程退出

扩展

swoole里面的异步IO 读写文件 读写mysql 读写redis 也是异曲同工
异步IO 是先返回结果 再进行IO&#xff0c;不过这种大多应用于耗时间长但是结果不影响程序的情况&#xff0c;比如&#xff1a;
文章阅读量&#43;1
同步的流程是 redis/mysql 数据&#43;1->显示文章
而异步的流程是 直接显示文章 然后再发redis/mysql 数据&#43;1
这样子用户就减少了等待的时间&#xff0c;当然还有很多场景也适用
有兴趣的小伙伴可以继续研究文档io的部分&#xff0c;这里就不继续深究了

如果这篇文章对你有用&#xff0c;可以点个赞或者是收藏&#xff0c;算是对作者的鼓励~

文档地址传送门:https://wiki.swoole.com/wiki/...
推荐singwa老师的视频教程&#xff1a;https://coding.imooc.com/clas...

另附上小弟网站。。。www.entercode.cn 推广一波...



推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • yum安装_Redis —yum安装全过程
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Redis—yum安装全过程相关的知识,希望对你有一定的参考价值。访问https://redi ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
author-avatar
手机用户2502887197
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有