<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 協程 協程不是進程或線程,其執行過程更類似于子例程,或者說不帶返回值的函數調用。 一個程序可以包含多個協程,可以對比與一個進程包含多個線程,因而下面我們來比較協程和線程。而多個線程相對獨立,有自己的上下文,切換受系統控制; 而協程也相對獨立,有自己的上下文,但是其切換由自己控制,由當前協程切換到其他協程由當前協程來控制。![](https://img.kancloud.cn/61/dd/61dda19bced1ffdec630541db5afb4ac_725x1198.png) ## 協程執行順序 原生php代碼: ~~~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) * swoole擴展實現 swoole實現協程代碼: ~~~php <?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>

                              哎呀哎呀视频在线观看