成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

如何用PHP實現多線程編程

瀏覽:4日期:2022-09-07 11:40:30
目錄多線程線程適用場景PHP中的多線程線程安全PHP 實現類和方法實例代碼異步請求超時控制總結多線程線程

首先說下線程:

線程(thread) 是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發多個線程,每條線程并行執行不同的任務.

使用多線程主要是因為它在執行效率上有很大優勢。由于線程是操作系統能夠進行調度的最小單位:

一個多線程程序比單線程程序被操作系統調度的概率更大,所以多線程程序一般會比單線程程序更高效; 多線程程序的多個線程可以在多核 CPU 的多個核心同時運行,可以將完全發揮機器多核的優勢;

同時對比多進程程序,多線程有以下特點:

線程的創建和切換的系統開銷都比進程要小,所以一定程度上會比多進程更高效; 線程天生的共享內存空間,線程間的通信更簡單,避免了進程IPC引入新的復雜度。適用場景

多線程的優化是很多,可是無腦使用多線程并不能提升程序的執行效率,因為線程的創建和銷毀、上下文切換、線程同步等也是有性能損耗的,耗費時間可能比順序執行的代碼還多。如:

sumSmall是一個從1累加到50000的函數。

如何用PHP實現多線程編程

上圖是在主線程內執行了三次 sumSmall 和三個線程分別執行 sumSmall ,再將結果同步到一個線程的時間對比,我們會發現只在主線程執行的時間反而更短,三個線程創建、切換、同步的時間遠遠大過了線程異步執行節省的時間。

而函數 sumLarge 從1累加到5000000,下圖同一線程執行三次和三個線程執行的耗時:

如何用PHP實現多線程編程

這次,多線程終于有效率優勢了。

是否使用多線程還需要根據具體需求而定,一般考慮以下兩種情況:

I/O 阻塞會使操作系統發生任務調度,阻塞當前任務,所以代碼中 I/O 多的情況下,使用多線程時可以將代碼并行。例如多次讀整塊的文件,或請求多個網絡資源。 多線程能充分利用 CPU,所以有多處大計算量代碼時,也可以使用多線程使他們并行執行,例如上文中后一個例子。PHP中的多線程

PHP 默認并不支持多線程,要使用多線程需要安裝 pthread 擴展,而要安裝 pthread 擴展,必須使用 --enable-maintainer-zts 參數重新編譯 PHP,這個參數是指定編譯 PHP 時使用線程安全方式。

線程安全

多線程是讓程序變得不安分的一個因素,在使用多線程之前,首先要考慮線程安全問題:

線程安全:線程安全是編程中的術語,指某個函數、函數庫在多線程環境中被調用時,能夠正確地處理多個線程之間的共享變量,使程序功能正確完成。

在傳統多線程中,由于多個線程共享變量,所以可能會導致出現如下問題:

1.存在一個全局數組$arr = array(’a’);;

2.A 線程獲取數組長度為1;

3.B 線程獲取數組長度為1;

4.A 線程 pop 出數組元素 $a = array_pop($arr); $a = ’a’;;

5.B 線程也 pop 數組元素 $b = array_pop($arr); $a = null;;

6.此時 B 線程內就出現了靈異事件,明明數組長度大于0,或沒有 pop 出東西;

PHP 實現

PHP 實現的線程安全主要是使用 TSRM 機制對 全局變量和靜態變量進行了隔離,將全局變量和靜態變量 給每個線程都復制了一份,各線程使用的都是主線程的一個備份,從而避免了變量沖突,也就不會出現線程安全問題。

PHP 對多線程的封裝保證了線程安全,程序員不用考慮對全局變量加各種鎖來避免讀寫沖突了,同時也減少了出錯的機會,寫出的代碼更加安全。

但由此導致的是,子線程一旦開始運行,主線程便無法再對子線程運行細節進行調整了,線程一定程度上失去了線程之間通過全局變量進行消息傳遞的能力。

同時 PHP 開啟線程安全選項后,使用 TSRM 機制分配和使用變量時也會有額外的損耗,所以在不需要多線程的 PHP 環境中,使用 PHP 的 ZTS (非線程安全) 版本就好。

類和方法

PHP 將線程 封裝成了 Thread 類,線程的創建通過實例化一個線程對象來實現,由于類的封裝性,變量的使用只能通過構造函數傳入,而線程運算結果也需要通過類變量傳出。

下面介紹幾個常用的 Thread 類方法:

run():此方法是一個抽象方法,每個線程都要實現此方法,線程開始運行后,此方法中的代碼會自動執行; start():在主線程內調用此方法以開始運行一個線程; join():各個線程相對于主線程都是異步執行,調用此方法會等待線程執行結束; kill():強制線程結束; isRunning():返回線程的運行狀態,線程正在執行run()方法的代碼時會返回 true;

因為線程安全的實現,PHP 的多線程開始運行后,無法再通過共享內存空間通信,線程也無法通過線程間通信復用,所以我認為 PHP 的“線程池”并沒有什么意義。擴展內自帶的Pool 類是一個對多線程分配管理的類,這里也不再多介紹了。

實例代碼

下面是一個線程類,用來請求某一接口。接下來根據它寫兩個多線程的應用實例:

class Request extends Thread { public $url; public $response; public function __construct($url) {$this->url = $url; } public function run() {$this->response = file_get_contents($this->url); }}異步請求

將同步的請求拆分為多個線程異步調用,以提升程序的運行效率。

$chG = new Request('www.google.com');$chB = new Request('www.baidu.com');$chG ->start();$chB ->start();$chG->join();$chB->join();$gl = $chG->response;$bd = $chB->response;超時控制

偶然間發現公司網站某一網頁上的一塊內容時有時無,不知道具體實現,但這給了我使用多線程的靈感:利用線程異步實現快速失敗和超時控制。

我們在使用 curl 請求某個地址時,可以通過 CURLOPT_CONNECTTIMEOUT / CURLOPT_TIMEOUT 參數分別設置 curl 的連接超時時間和讀取數據超時時間,但總的超時時間不好控制。而且在進行數據庫查詢時的超時時間無法設置(鳥哥博客:為MySQL設置查詢超時)。

這時我們便可以借用多線程來實現此功能:在執行線程類的 start() 方法后,不調用 join() 方法,使線程一直處于異步狀態,不阻塞主線程的執行。

此時主線程相當于旗艦,而各子線程相當于巡航艦,旗艦到達某地后不必要一直等待巡航艦也歸來,等待一段時間后離開即可,從而避免巡航艦意外時旗艦白白空等。

代碼:

$chG = new Request('www.google.com');$chB = new Request('www.baidu.com');$chG->start();$chB->start();$chB->join();// 此處不對chG執行join方法sleep(1); // sleep一個能接受的超時時間$gl = $chG->response;$bd = $chB->response;$bd->kill();if (!$gl) { $gl = ''; // 處理異常,或在線程類內給$gl一個默認值}總結

PHP 對多線程進行的封(yan)裝(ge),讓人用線程用得非常不盡興。雖然安全,也保持 PHP 簡單易用的一貫風格,卻無法完全發揮多線程的能力。

以上就是如何用PHP實現多線程編程的詳細內容,更多關于用PHP實現多線程編程的資料請關注好吧啦網其它相關文章!

標簽: PHP
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲一区二区视频| 亚洲免费色视频| 中文字幕不卡三区| 不卡一区二区中文字幕| 777久久久精品| 麻豆精品一区二区综合av| 亚洲欧美日韩视频二区| 亚洲人一二三区| 黑人一区二区| 久久精品欧美一区二区三区不卡| 国产成人自拍网| 欧美日韩免费电影| 久久精品噜噜噜成人88aⅴ| 一本一本大道香蕉久在线精品 | 亚洲人成网站在线| 欧美日本韩国一区二区三区| 2024国产精品| eeuss鲁片一区二区三区 | 亚洲自拍偷拍av| 亚洲欧洲日夜超级视频| 国产精品久久久久三级| 狠狠色噜噜狠狠色综合久| 国产丝袜在线精品| 色综合久久中文综合久久97| 国产日韩欧美激情| 欧美精品一区二区三区在线看午夜| 久久久亚洲午夜电影| 成人av网站免费| 久久精品在线观看| 欧美凹凸一区二区三区视频| 国产色爱av资源综合区| 色综合天天天天做夜夜夜夜做| 精品va天堂亚洲国产| 色综合夜色一区| 国产精品不卡一区二区三区| 亚洲国产一区在线| 亚洲日本电影在线| 久久精品综合一区| 日韩av一二三| 欧美日韩在线直播| 国产精品一区二区黑丝| 日韩一级欧美一级| 国产成人午夜精品5599| 久久综合九色综合97婷婷| 欧美精品v日韩精品v国产精品| 国产精品美女久久久久高潮| 国产亚洲第一区| 麻豆精品一区二区综合av| 91精品国产一区二区三区香蕉| 成人午夜大片免费观看| 久久久www免费人成精品| 一区在线视频观看| 亚洲午夜激情网站| 欧美在线|欧美| 国产一区二区三区最好精华液| 日韩三级伦理片妻子的秘密按摩| 不卡电影一区二区三区| 欧美激情一区在线观看| 99国内精品| 日本欧美一区二区| 日韩一区二区三区精品视频| 欧美精品在线一区| 亚洲国产一区二区三区| 欧美日本精品一区二区三区| proumb性欧美在线观看| 亚洲你懂的在线视频| 色88888久久久久久影院按摩| 国产精品91一区二区| 久久综合九色综合97婷婷 | 欧美久久久影院| 成人爱爱电影网址| 亚洲欧美日韩久久| 欧美视频在线播放| 91影视在线播放| 樱桃视频在线观看一区| 欧美人妇做爰xxxⅹ性高电影 | 久久不射2019中文字幕| 国产乱码精品1区2区3区| 久久久综合激的五月天| 亚洲伦理精品| 久久91精品国产91久久小草| 精品精品国产高清一毛片一天堂| 尤物在线精品| 久久成人精品无人区| 精品成a人在线观看| 一本久道久久综合狠狠爱| 韩国av一区二区| 国产精品久久久久影院老司| 欧美图片一区二区三区| 欧美精品首页| 久久成人av少妇免费| 国产精品色哟哟网站| 在线观看欧美日本| 女同一区二区| 美女视频黄 久久| 久久久777精品电影网影网| 国产精品资源| 不卡视频免费播放| 日韩和欧美一区二区三区| 精品理论电影在线| 久久国产福利| 91美女在线视频| 美女mm1313爽爽久久久蜜臀| 国产亚洲污的网站| 欧美在线观看禁18| 亚洲网站在线| 国产精品69久久久久水密桃| 亚洲柠檬福利资源导航| 777久久久精品| 一区二区三区免费看| 成熟亚洲日本毛茸茸凸凹| 亚洲成人精品一区二区| 久久九九99视频| 欧美巨大另类极品videosbest | 黄色精品一二区| 亚洲色图视频网| 日韩午夜激情视频| 色综合久久久久久久| 国产一区日韩一区| 国产成人精品www牛牛影视| 午夜伊人狠狠久久| 久久先锋影音av| 欧美日韩国产高清一区| 国产精品久久久久9999高清| 91丝袜国产在线播放| 久久超碰97人人做人人爱| 亚洲日本青草视频在线怡红院 | 国产精品正在播放| 亚洲国产一区视频| 国产精品区一区二区三| 91精品欧美综合在线观看最新| 国产精品日本一区二区| 午夜精品久久| 国产精品99久久久| 青椒成人免费视频| 亚洲精品国产无天堂网2021| 精品国产污污免费网站入口| 欧美性一区二区| 亚洲欧美国产不卡| 激情久久一区| 91小视频在线观看| 国产原创一区二区三区| 五月天中文字幕一区二区| 中文字幕一区在线| 久久久久久久一区| 91麻豆精品国产91久久久使用方法 | 狠狠色丁香九九婷婷综合五月| 亚洲黄色在线视频| 国产精品美女久久久久aⅴ| 久久人人爽爽爽人久久久| 91精品国产欧美一区二区| 91久久精品一区二区三| 亚洲尤物在线| 一区在线免费| 欧美激情1区| 丁香一区二区三区| 国产一区二区三区不卡在线观看| 日韩中文字幕区一区有砖一区 | 天堂成人免费av电影一区| 亚洲日本va午夜在线电影| 欧美国产一区视频在线观看| 精品免费日韩av| 日韩一区二区在线看| 欧美人与禽zozo性伦| 在线观看91视频| 日本高清视频一区二区| 久久精品国产清高在天天线| 99亚洲一区二区| 亚洲精品日韩久久| 好吊色欧美一区二区三区视频| 91无套直看片红桃| 99re在线精品| 99re6这里只有精品视频在线观看| 懂色一区二区三区免费观看| 国产不卡高清在线观看视频| 国产精品一区专区| 国产传媒久久文化传媒| 国产寡妇亲子伦一区二区| 精品亚洲porn| 国产一区二区成人久久免费影院| 国内久久婷婷综合| 国产久卡久卡久卡久卡视频精品| 奇米精品一区二区三区在线观看一| 亚洲成a人片综合在线| 亚洲成人动漫一区| 日韩精品成人一区二区三区| 免费在线观看一区| 久99久精品视频免费观看| 精品一区二区综合| 国产乱码精品1区2区3区| 国产不卡视频一区二区三区| 成人黄动漫网站免费app| 成人免费看黄yyy456| 国产91综合网| 99久久伊人网影院| 99久久精品国产观看| 97se亚洲国产综合在线| 欧美激情亚洲| 亚洲国产1区| 麻豆成人在线|