<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                >[info] EasySwoole 協程操作指南 ### **協程:** ***** 協程不是進程或線程,其執行過程更類似于子例程,或者說不帶返回值的函數調用。 一個程序可以包含多個協程,可以對比與一個進程包含多個線程,因而下面我們來比較協程和線程。而多個線程相對獨立,有自己的上下文,切換受系統控制; 而協程也相對獨立,有自己的上下文,但是其切換由自己控制,由當前協程切換到其他協程由當前協程來控制。 ![](https://img.kancloud.cn/4d/1d/4d1d88dba316211163f4c899e284d072_725x1198.png) ### **協程執行順序:** ~~~php <?php function task1() { for ($i = 0; $i <= 300; $i++) { // 寫入文件,大概要 3000 微秒 usleep(3000); echo "寫入文件{$i}\n"; } } function task2() { for ($i = 0; $i <= 500; $i++) { // 發送郵件給 500 名會員,大概 3000 微秒 usleep(3000); echo "發送郵件{$i}\n"; } } function task3() { for ($i = 0; $i <= 100; $i++) { // 模擬插入 100 條數據,大概 3000 微秒 usleep(3000); echo "插入數據{$i}\n"; } } task1(); task2(); task3(); ~~~ 在這個代碼中,我們主要做了 3 件事:寫入文件、發送郵件、及插入數據。 再看下面這段代碼: ~~~php <?php function task1($i) { // 使用 $i 標識 寫入文件,,大概要3000微秒 if ($i > 300) { return false;// 超過 300 不用寫了 } echo "寫入文件{$i}\n"; usleep(3000); return true; } function task2($i) { // 使用 $i 標識 發送郵件,大概要 3000 微秒 if ($i > 500) { return false;// 超過 500 不用發送了 } echo "發送郵件{$i}\n"; usleep(3000); return true; } function task3($i) { // 使用 $i 標識 插入數據,大概要 3000 微秒 if ($i > 100) { return false;// 超過 100 不用插入 } echo "插入數據{$i}\n"; usleep(3000); return true; } $i = 0; $task1Result = true; $task2Result = true; $task3Result = true; while (true) { $task1Result && $task1Result = task1($i); $task2Result && $task2Result = task2($i); $task3Result && $task3Result = task3($i); if ($task1Result === false && $task2Result === false && $task3Result === false) { break;// 全部任務完成,退出循環 } $i++; } ~~~ 這段代碼也是做了 3 件事,寫入文件、發送郵件和插入數據。但是和上面的不同的是,這段代碼將這 3 件事交叉執行,每個任務執行完一次之后,切換到另一個任務,如此循環。類似于這樣的執行順序,就是協程。 >[] 協程是指一種用代碼實現任務交叉執行的邏輯,協程可以使得代碼 1 中的 3 個函數交叉運行,在實現了協程的框架中,我們不需要通過代碼 2 的方法實現任務交叉執行。直接可讓代碼 1 中的 while(1),執行一次后切換。 ### **協程實現:** 在`php`中,實現協程主要使用 2 種方式: * `yield`生成器實現 (詳細原理可查看[http://www.php20.cn/article/148](http://www.php20.cn/article/148)) * `swoole`擴展實現 `swoole`實現協程代碼: ~~~ <?php function task1() { for ($i = 0; $i <= 300; $i++) { // 寫入文件,大概要 3000 微秒 usleep(3000); echo "寫入文件{$i}\n"; Co::sleep(0.001);// 掛起當前協程,0.001 秒后恢復 // 相當于切換協程 } } function task2() { for ($i = 0; $i <= 500; $i++) { // 發送郵件給 500 名會員,大概 3000 微秒 usleep(3000); echo "發送郵件{$i}\n"; Co::sleep(0.001);// 掛起當前協程,0.001 秒后恢復 // 相當于切換協程 } } function task3() { for ($i = 0; $i <= 100; $i++) { // 模擬插入 100 條數據,大概 3000 微秒 usleep(3000); echo "插入數據{$i}\n"; Co::sleep(0.001);// 掛起當前協程,0.001 秒后恢復 // 相當于切換協程 } } $pid1 = go('task1');// go 函數是 swoole 的開啟協程函數,用于開啟一個協程 $pid2 = go('task2'); $pid3 = go('task3'); ~~~ >[] 為什么要用`sleep`掛起協程實現切換呢?因為`swoole`的協程是自動的,當協程內遇上`I/O`操作 (mysql、redis) 等時,`swoole`的協程會自動切換,運行到下一個協程任務中 (切換后,I/O繼續執行),直到下一個協程任務完成或者被切換 (遇上 I/O),如此反復,直到所有協程任務完成,則任務完成。 ### **協程與進程:** 由上面的`協程執行順序`中的代碼 2,我們很容易發現,協程其實只是運行在一個進程中的函數,只是這個函數會被切換到下一個執行,可以這么說: >[] 協程只是一串運行在進程中的任務代碼,只是這些任務代碼可以交叉運行。 注意,協程并不是多任務并行,屬于多任務串行,每個進程在一個時間只執行了一個任務。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看