swoole的學習之非同步任務task的解析

來源:互聯網
上載者:User
這篇文章主要介紹了關於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的部分,這裡就不繼續深究了

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.