目錄
持續更新中。。。
什麼是非同步任務?
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的部分,這裡就不繼續深究了
如果這篇文章對你有用,可以點個贊或者是收藏,算是對作者的鼓勵~
文件地址傳送門:https://wiki.swoole.com/wiki/...
推薦singwa老師的視訊教程:https://coding.imooc.com/clas...
另附上小弟網站。。。www.entercode.cn 推廣一波...