各类知识收集,PHP技术分享与解决方案各类知识收集,PHP技术分享与解决方案各类知识收集,PHP技术分享与解决方案

Str Tom,为分享PHP技术和解决方案,贡献一份自己的力量!
收藏本站(不迷路),每天更新好文章!
当前位置:首页 > CMS教程 > PHP

swoole的学习之异步任务task的解析

管理员 2023-09-05
PHP
190

swoole的学习之异步任务task的解析

内容导读

收集整理的这篇技术教程文章主要介绍了swoole的学习之异步任务task的解析,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2607字,纯文字阅读大概需要4分钟

内容图文

这篇文章主要介绍了关于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."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代码

    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的部分,这里就不继续深究了

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

如何使用swoole来创建服务器(下)

以上就是swoole的学习之异步任务task的解析的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的swoole的学习之异步任务task的解析全部内容,希望文章能够帮你解决swoole的学习之异步任务task的解析所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

扫码关注

qrcode

QQ交谈

回顶部