日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

如何用PHP實現(xiàn)多線程編程

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

首先說下線程:

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

使用多線程主要是因為它在執(zhí)行效率上有很大優(yōu)勢。由于線程是操作系統(tǒng)能夠進行調(diào)度的最小單位:

一個多線程程序比單線程程序被操作系統(tǒng)調(diào)度的概率更大,所以多線程程序一般會比單線程程序更高效; 多線程程序的多個線程可以在多核 CPU 的多個核心同時運行,可以將完全發(fā)揮機器多核的優(yōu)勢;

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

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

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

sumSmall是一個從1累加到50000的函數(shù)。

如何用PHP實現(xiàn)多線程編程

上圖是在主線程內(nèi)執(zhí)行了三次 sumSmall 和三個線程分別執(zhí)行 sumSmall ,再將結(jié)果同步到一個線程的時間對比,我們會發(fā)現(xiàn)只在主線程執(zhí)行的時間反而更短,三個線程創(chuàng)建、切換、同步的時間遠遠大過了線程異步執(zhí)行節(jié)省的時間。

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

如何用PHP實現(xiàn)多線程編程

這次,多線程終于有效率優(yōu)勢了。

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

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

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

線程安全

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

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

在傳統(tǒng)多線程中,由于多個線程共享變量,所以可能會導致出現(xiàn)如下問題:

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

2.A 線程獲取數(shù)組長度為1;

3.B 線程獲取數(shù)組長度為1;

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

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

6.此時 B 線程內(nèi)就出現(xiàn)了靈異事件,明明數(shù)組長度大于0,或沒有 pop 出東西;

PHP 實現(xiàn)

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

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

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

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

類和方法

PHP 將線程 封裝成了 Thread 類,線程的創(chuàng)建通過實例化一個線程對象來實現(xiàn),由于類的封裝性,變量的使用只能通過構(gòu)造函數(shù)傳入,而線程運算結(jié)果也需要通過類變量傳出。

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

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

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

實例代碼

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

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); }}異步請求

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

$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;超時控制

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

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

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

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

代碼:

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

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

以上就是如何用PHP實現(xiàn)多線程編程的詳細內(nèi)容,更多關(guān)于用PHP實現(xiàn)多線程編程的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: PHP
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费在线观看日韩欧美| 国产午夜久久| 亚洲乱码一区| 国产精品毛片在线| 亚洲欧洲另类| 好吊日精品视频| 国产毛片一区| 日韩中文欧美在线| 日本欧美在线看| 中文视频一区| 欧美日韩中文字幕一区二区三区| 午夜影院一区| 亚洲成av在线| 九九综合九九| 亚洲主播在线| 国产偷自视频区视频一区二区| 国产农村妇女精品一二区| 亚洲成人日韩| 免费日本视频一区| 日韩精品国产欧美| 国产日韩高清一区二区三区在线 | 国产亚洲精品v| 亚洲欧美日韩精品一区二区| 免费美女久久99| 天堂va在线高清一区| 日韩不卡一区二区| 国产精品高潮呻吟久久久久| 精品黄色一级片| 黄在线观看免费网站ktv| 亚洲成av人片一区二区密柚| 国产精品7m凸凹视频分类| 国产视频一区欧美| 视频精品一区| 人人爱人人干婷婷丁香亚洲| 国产精品久久久久久模特| 精品久久97| 欧美日韩精品一区二区视频| 热久久免费视频| 日本视频中文字幕一区二区三区| 国产乱人伦精品一区| 国产成人免费| 日韩精品久久久久久久电影99爱 | 免费视频一区三区| 亚洲一区二区av| 国产精品99久久免费观看| 日韩欧美精品| 亚洲一级淫片| 国产精品久久久久毛片大屁完整版| 国产91在线精品| 亚洲激情不卡| 国产精品亚洲欧美一级在线| 激情黄产视频在线免费观看| 亚洲深夜av| 久久一区欧美| 国产婷婷精品| 精品一区二区三区视频在线播放| 国内激情久久| 欧美一区成人| 在线看片福利| 日韩精品五月天| 久久久久久夜| 视频一区二区三区在线| 国产精品伊人| 久久国产电影| 国产精品手机在线播放| 91精品一区二区三区综合在线爱| 婷婷成人av| 播放一区二区| 欧美亚洲三级| 在线国产一区| 国产精品99视频| 六月天综合网| 中文一区一区三区高中清不卡免费| 蜜桃视频一区二区| 日韩a一区二区| 亚洲精品极品| 日韩在线欧美| 亚洲另类av| 日韩另类视频| 国产精品日韩精品中文字幕| 婷婷亚洲五月| 精品72久久久久中文字幕| 蜜桃视频在线观看一区| 亚洲www免费| 国产日韩一区二区三免费高清 | 一区二区三区网站| 久久久精品五月天| 欧美激情视频一区二区三区免费| 日本欧美在线看| 久久高清免费| 久久男人av资源站| 国产另类在线| 日韩激情一区二区| 亚洲欧美日韩综合国产aⅴ| 麻豆视频在线观看免费网站黄| 国产精品视频一区二区三区四蜜臂| 亚洲综合不卡| 九一精品国产| 成人免费网站www网站高清| 精品一区二区三区亚洲| 国产情侣一区| 日韩精品亚洲一区二区三区免费| 国产亚洲激情| 91精品在线观看国产| 国产精品宾馆| 日本一区二区中文字幕| 99香蕉国产精品偷在线观看 | av最新在线| 麻豆国产91在线播放| 国产精品任我爽爆在线播放| 黄色在线网站噜噜噜| 国产一区二区三区四区五区传媒| 亚洲欧美伊人| 视频一区日韩精品| 免费在线观看日韩欧美| 色婷婷久久久| 午夜精品成人av| 国产精品白丝一区二区三区| 欧美片网站免费| 久久成人av| 欧美在线资源| 欧美三级网址| 欧美精品福利| 国产一区日韩一区| 国内精品美女在线观看| 欧美日韩视频免费看| 热久久国产精品| 国产v日韩v欧美v| 亚洲精品日韩久久| 亚洲香蕉网站| 女同性一区二区三区人了人一| 99xxxx成人网| 红桃视频国产精品| 另类av一区二区| 日韩欧美中文字幕一区二区三区| 视频在线在亚洲| 国产精品最新| 国产美女亚洲精品7777| 亚洲高清久久| 日韩在线看片| 国产传媒av在线| 久久久久91| 日韩国产欧美在线视频| 红桃视频国产精品| 亚洲天堂免费| 久久要要av| 久久成人一区| 性感美女一区二区在线观看| 日韩欧美中文| 成人美女视频| 特黄毛片在线观看| 国模大尺度视频一区二区| 国产欧美日韩视频在线| 亚洲精品伊人| 亚洲伊人精品酒店| 久久国产精品久久久久久电车| 亚洲一级黄色| 播放一区二区| 丝瓜av网站精品一区二区| 91久久在线| 蜜臀久久99精品久久久画质超高清| 日韩精品视频中文字幕| 亚洲三级网址| 国产精品xxx| 精品国产一区二区三区性色av| аⅴ资源天堂资源库在线| 老司机免费视频一区二区| 成人小电影网站| 国产精品日韩久久久| 免费日本视频一区| 美女久久99| 日韩电影免费网站| 国产精品毛片| 亚洲色图国产| 国产一区国产二区国产三区| 亚洲啊v在线| 亚洲精品福利| 久久不卡国产精品一区二区| 国产精品二区不卡| 91成人精品| 日日摸夜夜添夜夜添国产精品| 欧美激情视频一区二区三区免费 | 色偷偷色偷偷色偷偷在线视频| 香蕉国产精品| 日韩在线视频一区二区三区| 岛国精品一区| 亚洲一区二区三区四区五区午夜| 日韩1区2区3区| 日韩三区免费| 丝袜a∨在线一区二区三区不卡| 国产欧美日韩免费观看| 毛片在线网站| 99视频精品| 国产精品一区二区三区美女 | 中文字幕av亚洲精品一部二部| 日本v片在线高清不卡在线观看| 久久精品五月| 亚洲视频二区| 美腿丝袜在线亚洲一区| 亚洲精品一二三区区别|