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

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

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

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

首先說(shuō)下線程:

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

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

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

同時(shí)對(duì)比多進(jìn)程程序,多線程有以下特點(diǎn):

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

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

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

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

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

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

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

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

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

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

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

線程安全

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

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

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

1.存在一個(gè)全局?jǐn)?shù)組$arr = array(’a’);;

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

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

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

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

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

PHP 實(shí)現(xiàn)

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

PHP 對(duì)多線程的封裝保證了線程安全,程序員不用考慮對(duì)全局變量加各種鎖來(lái)避免讀寫沖突了,同時(shí)也減少了出錯(cuò)的機(jī)會(huì),寫出的代碼更加安全。

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

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

類和方法

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

下面介紹幾個(gè)常用的 Thread 類方法:

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

因?yàn)榫€程安全的實(shí)現(xiàn),PHP 的多線程開始運(yùn)行后,無(wú)法再通過(guò)共享內(nèi)存空間通信,線程也無(wú)法通過(guò)線程間通信復(fù)用,所以我認(rèn)為 PHP 的“線程池”并沒(méi)有什么意義。擴(kuò)展內(nèi)自帶的Pool 類是一個(gè)對(duì)多線程分配管理的類,這里也不再多介紹了。

實(shí)例代碼

下面是一個(gè)線程類,用來(lái)請(qǐng)求某一接口。接下來(lái)根據(jù)它寫兩個(gè)多線程的應(yīng)用實(shí)例:

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); }}異步請(qǐng)求

將同步的請(qǐng)求拆分為多個(gè)線程異步調(diào)用,以提升程序的運(yùn)行效率。

$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;超時(shí)控制

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

我們?cè)谑褂?curl 請(qǐng)求某個(gè)地址時(shí),可以通過(guò) CURLOPT_CONNECTTIMEOUT / CURLOPT_TIMEOUT 參數(shù)分別設(shè)置 curl 的連接超時(shí)時(shí)間和讀取數(shù)據(jù)超時(shí)時(shí)間,但總的超時(shí)時(shí)間不好控制。而且在進(jìn)行數(shù)據(jù)庫(kù)查詢時(shí)的超時(shí)時(shí)間無(wú)法設(shè)置(鳥哥博客:為MySQL設(shè)置查詢超時(shí))。

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

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

代碼:

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

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

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

標(biāo)簽: PHP
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
人人精品人人爱| 国产精品午夜一区二区三区| 91一区二区三区四区| 亚洲免费一区三区| 亚洲精品乱码| 亚洲精品日本| 欧美日本三区| 亚洲在线久久| 最近国产精品视频| 日本午夜精品久久久| 91精品国产自产观看在线| 欧美日韩视频免费看| 国产精品丝袜在线播放| 精品免费av| 天堂√中文最新版在线| 欧美高清一区| 免费观看日韩电影| 日韩和欧美一区二区三区| 久久国产麻豆精品| 久久影院资源站| 欧美日韩在线观看首页| 免费视频亚洲| 久久成人亚洲| 日韩二区三区四区| 麻豆一区二区三| 久久国产精品成人免费观看的软件| 国产偷自视频区视频一区二区| 日韩精品一区二区三区中文字幕| 欧美国产另类| 亚洲无线一线二线三线区别av| 亚洲一区观看| 国产精品4hu.www| 久久精品99久久无色码中文字幕| 亚洲一区日韩| 国产精品2023| 999国产精品| 亚洲aa在线| 国产精品香蕉| 久久久噜噜噜| 午夜性色一区二区三区免费视频| 欧美激情aⅴ一区二区三区| 午夜欧美巨大性欧美巨大| 鲁大师成人一区二区三区| 国产精品羞羞答答在线观看| 婷婷激情久久| 国产图片一区| 国产在线日韩| 欧美日韩1区2区3区| 久久久久一区| 国产欧美一区二区精品久久久| 日韩一区二区中文| 综合激情视频| 国产精品mm| 亚洲精品123区| 国产精品久久| 午夜久久免费观看| 国产精品巨作av| 免费久久精品| 国产美女亚洲精品7777| 99精品美女| 国产伦精品一区二区三区千人斩 | | 国产免费av一区二区三区| 日韩精品诱惑一区?区三区| 三级欧美在线一区| 黄色在线观看www| 日韩欧美中文字幕在线视频| 国产在线观看www| 亚洲精品日本| 蜜桃成人av| 免费在线欧美黄色| 日韩精品一区第一页| 中文一区一区三区高中清不卡免费| 男人操女人的视频在线观看欧美| 免费在线观看一区| 亚洲三级国产| 激情婷婷欧美| 成人综合一区| 国产欧美一区二区三区精品观看| 黄色成人精品网站| 国产一区二区精品久| 日韩一区精品| 亚洲一区二区三区四区五区午夜| 新版的欧美在线视频| 国产美女久久| 国产精品日本一区二区不卡视频| 91精品一区国产高清在线gif| 久久99偷拍| 日韩黄色在线观看| 水蜜桃久久夜色精品一区的特点 | 国产精品第一| 日韩欧美中文在线观看| 图片区亚洲欧美小说区| 亚洲啊v在线| 麻豆成人91精品二区三区| 日韩综合一区二区| 亚洲女同中文字幕| 日韩欧美精品一区| 精品久久国产一区| 国产精品一区2区3区| 日韩高清国产一区在线| 久久夜色精品| 亚洲成人一区在线观看| 日韩高清一区二区| 亚洲我射av| 亚洲欧美日韩国产一区二区| 亚洲精品一区三区三区在线观看| 九九九精品视频| 欧美在线日韩| 国产欧美在线| 青青草91久久久久久久久| 一区二区国产精品| 伊人国产精品| 婷婷久久免费视频| 亚洲精一区二区三区| 爽好多水快深点欧美视频| 欧美特黄a级高清免费大片a级| 久久理论电影| 欧美成人a交片免费看| 欧洲av不卡| 色婷婷亚洲mv天堂mv在影片| 日本一二区不卡| 91欧美国产| 亚洲天堂av影院| 国产h片在线观看| 亚洲深夜视频| 成人午夜国产| 亚洲欧美日韩高清在线| 狠狠干综合网| 视频一区欧美精品| 日韩一区二区三区精品| 日本欧美一区二区在线观看| 日本不卡高清| 日韩综合一区二区| 国产精品一国产精品k频道56| 久久久国产精品入口麻豆| 国产福利91精品一区二区| 久久精品国产网站| 精品一区二区三区视频在线播放| 精品三级久久久| 丝袜美腿一区| 婷婷综合亚洲| 亚洲最新av| 国产精品巨作av| 成人亚洲欧美| 欧美日韩黑人| 亚洲精品韩国| 嫩呦国产一区二区三区av| 久久一区欧美| 桃色一区二区| 久久夜色精品| 国产精品密蕾丝视频下载| 激情综合五月| 1024精品久久久久久久久| 亚洲三级在线| 精品视频在线一区二区在线| 国产成人精品亚洲线观看 | 丝袜国产日韩另类美女| 18国产精品| 国产网站在线| 亚洲精品中文字幕乱码| 亚洲欧美一级| 欧美aⅴ一区二区三区视频| 亚洲成人va| 综合亚洲视频| 美女视频黄久久| 婷婷激情久久| 热久久久久久| 色综合五月天| 成人av二区| 日韩av中文字幕一区二区 | 久久亚洲国产| 综合一区在线| 国产日韩欧美中文在线| 视频在线不卡免费观看| 黑丝一区二区| 美女久久久久久 | 99视频精品视频高清免费| 老牛影视一区二区三区| 国产高清日韩| 亚洲一区二区成人| 久久一区国产| 六月婷婷一区| 国产成人精品三级高清久久91| 欧美在线资源| 欧美国产中文高清| 9久re热视频在线精品| 日本国产欧美| 久久影院一区| 国产日韩中文在线中文字幕| 久久一区二区三区喷水| 91午夜精品| 午夜影院欧美| 国产一区二区精品久| 丝袜诱惑制服诱惑色一区在线观看| 欧美日韩亚洲一区二区三区在线| 亚洲国产专区校园欧美| 国产精品成人自拍| 日韩一区二区免费看| 久久尤物视频|