pthreads v3下一些坑和需要注意的地方
一、子執行緒無法訪問父執行緒的全域性變數,但父執行緒可以訪問子執行緒的變數
<?php class Task extends Thread { public $data; public function run() { global $num; var_dump($num); $this->data = 'abc'; //這是列印null var_dump($GLOBALS); $GLOBALS['test'] = 'def'; } } //主執行緒中的全域性變數,子執行緒中是無法訪問的 //php中建立子執行緒,它會有一個單獨的堆,執行在單獨的地址空間中 //並不能像有些語言中,子執行緒是可以訪問的到主執行緒中的變數的。 $num = 666; $GLOBALS['test'] = 'test'; $t = new Task(); $t->start() && $t->join(); //主執行緒可以訪問子執行緒的變數 var_dump($t->data);
結果如下:
二、子執行緒無法修改父執行緒的變數
<?php class Task extends Thread { private $data; public function __construct(&$data) { $this->data = $data; } public function run() { echo "task data : ", $this->data, "\n"; $this->data = 'def'; echo "task data : ", $this->data, "\n"; } } $data = 'abc'; //我們這裡傳入的是引用 $t = new Task($data); $t->start() && $t->join(); //但是$data變數資料並沒改變 //這說明我們通過建構函式傳入Task物件中的$data只是一個拷貝 //子執行緒中並不能夠操作主執行緒中的變數 var_dump($data);
結果如下:
三、pthreads v3版本可以設定成員為匿名函式
<?php class Task extends Thread { private $call; public function __construct() { //pthreads v3版本好像可以設定成員為匿名函式 //在v2版本中好像是不可以的 $this->call = function ($param1, $param2) { echo "task call param1 : {$param1} param2 : {$param2}\n"; }; } public function run() { //直接呼叫成員匿名函式 ($this->call)("hello", "world"); } } $t = new Task(); $t->start() && $t->join();
結果如下:
四、對於資料庫連線資源,我們需要宣告為靜態成員
<?php class Task extends Thread { private $db; public function __construct() { //注意這裡會報錯,不能對PDO例項進行序列化或反序列化 $this->db = new PDO('mysql:dbname=test;host=192.168.33.226', 'root', ''); } public function run() { $result = $this->db->query("select id,name from tb_user"); while ($row = $result->fetch(PDO::FETCH_ASSOC)) { echo "{$row['id']}\t{$row['name']}\n"; } } } $t = new Task(); $t->start() && $t->join();
結果如下:
程式碼修改如下:
<?php class Task extends Thread { //我們需要把資料庫連線資源,宣告為靜態成員,然後呼叫靜態方法進行建立 private static $db; //我們直接在__construct()建構函式裡對$db進行例項化,好像會是null,有興趣的可以試試 public static function getConn() { if (!is_resource(self::$db)) { self::$db = new PDO('mysql:dbname=test;host=192.168.33.226', 'root', ''); } return self::$db; } public function run() { $result = self::getConn()->query("select id,name from tb_user"); while ($row = $result->fetch(PDO::FETCH_ASSOC)) { echo "{$row['id']}\t{$row['name']}\n"; } } } $t = new Task(); $t->start() && $t->join();
結果如下:
最後說明,不排除pthreads以後的版本升級上面的有些問題不會出現。
我的php版本是7.2.4,pthreads的版本是3.1.7dev
相關推薦
pthreads v3下一些坑和需要注意的地方
一、子執行緒無法訪問父執行緒的全域性變數,但父執行緒可以訪問子執行緒的變數 <?php class Task extends Thread { public $data; public function run() { global $n
pthreads v3下的worker和pool的使用
有些人會想,明明用thread已經可以很好的工作了,為什麼還要搞個worker和pool? 之所以要用到worker和pool還是因為效率,因為系統建立一個新執行緒代價是比較昂貴,每個建立的執行緒會複製當前執行的整個上下文。 儘可能的重用執行緒可以讓我們的程式更高效。 一個簡單的worker例子:
Mysql分割槽表使用的一些限制和需要注意的地方
mysql分割槽策略都基於兩個非常重要的假設:查詢都能夠過濾(prunning)掉很多額外的分割槽、分割槽本身並不會帶來很多額外的代價。而事實證明,這兩個假設在某些場景下會有問題。下面介紹一些可能會遇到的問題。 NULL位會使分割槽過濾無效 關於分割槽表一個容易讓人
【高併發】高併發環境下構建快取服務需要注意哪些問題?我和阿里P9聊了很久!
## 寫在前面 > 週末,跟阿里的一個朋友(去年晉升為P9了)聊了很久,聊的內容幾乎全是技術,當然了,兩個技術男聊得最多的話題當然就是技術了。從基礎到架構,從演算法到AI,無所不談。中間又穿插著不少天馬行空的想象,雖然現在看起來不太實際,但是隨著技術的進步,相信五年、十年之後都會實現的。 > &
VM ware 安裝時候的一些坑和解決辦法
1.解決VMware Workstation 不可恢復錯誤: (vcpu-0) 開機進入bios,開啟inter virtual technology enable 2.進入之後輸入密碼不顯示的,但是是有輸入的 &nb
python無法連線mysql,有個小坑,需要注意一下!
嘗試用python連結mysql資料庫,按照教程裡連結了小半夜,就是沒有連結上,找了各種文章,最後發現是版本的問題,我想使用的模組是MySQLdb,剛剛去他們的官網看了一下,最近一次更新是2014年,也就是說不支援python3.0以上版本。 同樣採坑的小夥伴們要注意了!!!!!!!! 解決辦法: 來源
Xpath使用例項和需要注意的事項
Xpath使用例項和需要注意的事項 Xpath的語法介紹就不贅述了,參考:https://blog.csdn.net/u011486491/article/details/84061432 這篇文章就以實際使用為例,對一些xpath比較複雜的情況進行討論使用。 常用的標籤提取欄位
走向前端,填下的坑和異常
1. NPM 命令執行 報錯 D:\webworkspace\WebpackDemo>npm -v module.js:327 throw err; ^ Error: Ca
Git 學習過程中遇到的一些坑和自己的一些理解
Git 在向遠端倉庫提交時出錯 我們看到的很多的git教程中都會先教你如何新建github倉庫,但是這裡有一個坑,就是,新建倉庫時勾選了Initialize this repository with a README,即為倉庫初始化一個README.md檔案,但是如果這樣的
最近使用gvoice的小隊語音 一些坑和感悟《一》
騰訊語音外掛gvoice,基於unity 至於匯入外掛什麼的就不多說,多的是教程,但是詳細的使用教程少的可憐,也是踩了好多坑,才算除錯通. 新建一個語音模組管理器 GVoiceManager,做成單例方便呼叫 public static GVoiceManager _Instan
Tomcat下使用Spring + JPA 需要注意的問題
Tomcat預設的類載入器不支援類轉換,所以需要使用自定義的類載入器,具體操作步驟如下: 1.在LocalContainerEntityManagerFactoryBean中,設定loadTimeWeaver屬性 <bean id="entityManagerFa
pthreads v3下的同步處理synchronized
之所以會用到同步,是因為如果多個執行緒中對同一個資源進行操作時,會發生混亂。 比如2個執行緒對變數進行加1操作,第1個執行緒還沒來的及改寫資料時,第2個執行緒就對變數進行操作了,那變數最終的結果就是未知的,這個時候就需要同步來進行控制了。 例子如下: <?php class Count
pthreads v3下的Volatile介紹與使用
由於pthreads v3中引入了Threaded物件自動不變性的概念,所以當我們在建構函式中給成員設定為陣列時,在其他地方就無法對成員再次改寫了。 例子如下: <?php //pthreads v3引入了Threaded物件自動不變性的概念 //如果成員被設定成Threaded物件,那
使用vue2+Vuex+Router寫的Demo以及遇到的一些坑和使用建議
一直對vue很感興趣,最近使用vue2.0開發了高仿餓了麼點餐系統來練練手,不得不說vue真是一個很不錯的框架,但是也遇到過一些坑,在這裡和大家分享一下 餓了麼點餐系統 vue2.0、vuex、vue-router、axios、webpac
網頁中QQ線上客服進行聊天的一些坑和解決方案
說明 從瀏覽器喚起QQ進行聊天,是很多公司或者企業會用到的一種客服方式,然而很多時候,一些手機端瀏覽器並不支援直接跳轉到QQ,或者不支援從App內嵌的網頁中跳轉到QQ頁面。 正文 針對跳轉喚起QQ,QQ推廣的官方網站http://shang.qq.com/v3/i
記錄下串列埠使用需要注意的地方
1.串列埠使用有時候讀取不了串列埠。不要一直去檢查驅動問題,偶爾看看你的板子上面是否有一個小開關,把串列埠功能關閉了。 2.另外,當串口占用之時,採用USB轉TTL型別的下載器就下載不了程式了。因為串列埠已經佔用了TX和Rx引腳,那麼當然下載器下載不了程式了。
hashCode 和 equals 正確用法和需要注意的地方(面試基本都會問)
文章來源: 文章目錄: 1、hashCode()和equals()的用法 2、重寫預設實現 3、使用Apache Commons Lang包重寫hashCode()和equals() 4、需要注意記住的事情 5、當使用ORM的時候特別要注意的 has
asp.net core系列 76 Apollo 快速安裝模式下填坑和ASP.NetCore結合使用
前言:由於公司佔時沒有運維,出於微服務的需要,Apollo只能先裝在windows 阿里雲上跑起來,由於環境及網路等問題,在安裝過程中遇到很多坑,算是一個個坑填完後,最終實現。 一. java jdk環境 java jdk 1.8下載地址: https://www.oracle.c
關於內購支付的流程和一些需要注意的坑
網路上關於內購支付的文章大都千篇一律,講述的是如何建立內購專案,最後再把內購發起的相關程式碼直接寫上就完事了。但是,在實際開發中,關於內購的坑卻多的讓人抓狂,比如常見的掉單,重複充值等情形。有的使用者反饋我明明釦過錢了,為何沒有充值?有的卻是使用者付了一次款,卻給衝了兩次+的額度,無論哪種情況,對開發者
使用python時需要注意的點和坑
最近使用Python的過程中遇到了一些坑,例如用datetime.datetime.now()這個可變物件作為函式的預設引數,模組迴圈依賴等等。 在此記錄一下,方便以後查詢和補充。 避免可變物件作為預設引數 在使用函式的過程中,經常會涉及預設引數。在Python中,當使用可變物件作為預設