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

目录php

持续更新中。。。html

什么是异步任务?

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

clipboard.png

在一些须要耗时间长的任务能够采起这种方案
无论从性能的发挥仍是用户体验都是比传统的方式舒服不少web


测试

web_server.phpredis

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

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


$server->start();

客户端js代码sql

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个客户端打开的时间我是相差了几秒打开的segmentfault

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

图片描述

结论

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

注意的地方

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

扩展

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 推广一波...

相关文章
相关标签/搜索