资讯专栏INFORMATION COLUMN

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

vincent_xyb / 527人阅读

摘要:目录初识创建服务器上创建服务器下异步任务持续更新中。。。什么是异步任务把当前的任务异步投递到进程池中执行,不影响接下来的事务。

目录

初识Swoole

创建服务器(上)

创建服务器(下)

异步任务task

持续更新中。。。

什么是异步任务?

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

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


测试

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."
";
    //投递异步任务
    $task_id = $server->task($frame->fd);
      echo "我们继续访问
";
});


$server->on("task", function ($server, $task_id, $from_id,$data) {
    for ($i=1; $i <=5 ; $i++) { 
         sleep(2);//休息2秒
         echo "taskid为:".$task_id."完成任务".$i."/5的任务了
";
    }
    $server->finish($data);
});

//处理异步任务的结果
$server->on("finish", function ($server, $task_id, $data) {
    echo "fd为:".$data.",task为:".$task_id."任务完成的时间是:".date("Y-m-d H:i:s")."
";
});


$server->start();

客户端js代码

    var url="ws://你的ip地址:8811";
    var websocket =new WebSocket(url);

websocket.onopen = function (evt) {
    console.log("Connected to WebSocket server.");
    websocket.send("客户端:建立链接成功");
};

websocket.onclose = function (evt) {
    console.log("Disconnected");
};

websocket.onmessage = function (evt) {
    console.log("Retrieved data from server: " + evt.data);
};

websocket.onerror = function (evt, e) {
    console.log("Error occured: " + evt.data);
};

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

这个时候看终端,重点来了:

结论

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

注意的地方

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

扩展

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

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

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28645.html

相关文章

  • Swoole学习手记(一)初识Swoole

    摘要:目录初识创建服务器上创建服务器下异步任务持续更新中。。。参加工作有一段时间了,偶尔会听到,对我这种小白粗略看下文档都会觉得很牛逼。个人理解就是解决这样应用场景的。 目录 初识Swoole 创建服务器(上) 创建服务器(下) 异步任务task 持续更新中。。。 参加工作有一段时间了,偶尔会听到swoole,对我这种PHP小白粗略看下文档都会觉得很牛逼。由于学习成本比较高,自身对网络异...

    yeyan1996 评论0 收藏0
  • swoole学习手记(三)创建服务器(下)

    摘要:目录初识创建服务器上创建服务器下异步任务持续更新中。。。而它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。 目录 初识Swoole 创建服务器(上) 创建服务器(下) 异步任务task 持续更新中。。。 1.创建HttpServer服务器 HttpServer是基于swoole_server,所以s...

    aikin 评论0 收藏0
  • swoole学习手记(二)创建服务器(上)

    摘要:目录初识创建服务器上创建服务器下异步任务持续更新中。。。启动后,客户端无需,直接可以向监听的端口发送数据包。 目录 初识Swoole 创建服务器(上) 创建服务器(下) 异步任务task 持续更新中。。。 1.创建tcp服务器 先照着文档创建一个tcp服务器

    cppowboy 评论0 收藏0
  • thinkphp5+swoole实现异步邮件群发(SMTP方式)

    摘要:图中其他两个文件和是邮件发送类的核心文件,为了简化调用,抽取了出来,详细的用法和参数设置,可以参考的使用说明注意点在此步骤中,我们需要注意几点是你设置的邮件发送的账号是否已经开启并且找对对应的安全协议和端口号。 1、环境说明 阿里云centos7thinkphp5.0.11swoole2.0.8 2、tp实现邮件发送 在项目下建立如下的文件目录:showImg(https://segm...

    tuniutech 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<