目錄php
持續更新中。。。html
1.把當前的任務異步投遞到TaskWorker進程池中執行,不影響接下來的事務。
舉個栗子:mysql
在一些須要耗時間長的任務能夠採起這種方案
無論從性能的發揮仍是用戶體驗都是比傳統的方式舒服不少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 推廣一波...