php多執行緒 傳入資料到執行緒中

2021-09-23 07:47:46 字數 1858 閱讀 9759

提到php多執行緒,網上的例子基本都是併發發起http請求,難道php多執行緒就只能幹這個嗎,搞笑。

於是,我寫了乙個使用多執行緒對100萬個數的排序,在測試的過程中發現了幾個問題,記錄一下。

php多執行緒只有在例項化的時候有機會傳入引數,於是,當我傳入陣列的時候,發現有點不對勁。

class test extends thread

public function run()

}$p = new test($fruit);

$p->start();

var_dump($p); // 為了檢視執行緒是否還在,如果執行緒內有錯誤的話,執行緒就會被 destroy

結果:

array(3) 

object(volatile)#2 (3)

object(test)#1 (2)

["response"]=>

null

}

也就是說,在建構函式中,我傳入陣列,給屬性賦值的時候,就變成了 volatile 物件。

關於 volatile 物件,檢視官方文件:

2、修改run()方法

public function run()
結果:報錯

也就說,只有建構函式中初始化的屬性才配用上 volatile 物件 。。。。。。

3、修改run()方法

public function run()
結果:報錯

php fatal error: uncaught runtimeexception: threaded members previously set

to threaded objects are immutable, cannot overwrite data

也就說,建構函式中初始化的屬性還不能改動它。。。。。。。。。

4、修改run()方法

public function run()
結果:可行

array(3) 

object(test)#1 (2)

["response"]=>

array(3)

}

對於 volatile 物件 ,懶得去研究,直接轉陣列就可以操作了啊。

5、修改run()方法

public function run()
結果:報錯,執行緒已終止

這就很無語了,莫名其妙嘛,於是嘗試這 thi

s−

>re

spon

se=(

arra

y)

this->response = (array)

this

−>re

spon

se=(

arra

y)data;

尼瑪,這樣可以,呵呵,沒搞懂。

注意點:

1.執行緒類的屬性不能直接進行雜湊表(陣列)操作,如:

//這樣是無效的

$this->var1["hello"] = "world";

//改為

$this->var1 = ["hello"=>"world"];

因為執行緒類屬性的賦值是通過序列化實現的,其本質是儲存了序列化資料,因此不支援php常用直接操作雜湊表(陣列)的操作

3.執行緒物件開闢了php的第二空間

執行緒在建立之後,無法訪問到父執行緒的變數,諸如$globals或global等用法都無法操作父執行緒的全域性變數,這應該是考慮到了執行緒安全的問題;

但是父執行緒卻能夠訪問子執行緒物件的內容;

php多執行緒

php socket 程式設計今天看到篇好的文章,把主要部分翻譯出來給大家一起分享,譯的不好,請悟見笑,如果有翻譯錯誤的地方請大蝦指出,小第隨時更正 contributed by icarus,c melonfire 序言 省略了,有時間再加上 讓我們以乙個簡單的例子開始 乙個接收輸入字串,處理並返...

PHP 多執行緒

php 5.3 以上版本,使用pthreads php擴充套件,可以使php真正地支援多執行緒。多執行緒在處理重複性的迴圈任務,能夠大大縮短程式執行時間。cd data tgz php 5.5.1 make clean make make install unzip pthreads master....

PHP多執行緒的實現(PHP多執行緒類)

通過web伺服器來實現php多執行緒功能。當然,對多執行緒有深入理解的人都知道通過web伺服器實現的多執行緒只能模仿多執行緒的一些效果,並不是真正意義上的多執行緒。但不管怎麼樣,它還是能滿足我們的一些需要的,在需要類似多執行緒的功能方面還是可以採用這個類。view source print?01.0...