php Pthread 多線程 (二) Worker和Threaded


<?php
//Worker是具有持久化上下文(執行環境)的線程對象
//Worker對象start()后,會執行run()方法,run()方法執行完畢,線程也不會消亡
class MySqlWorker extends Worker {
    private $name = '';
    private $db = null;

    public function __construct($name) {
        $this->name = $name;
    }

    public function run() {
        $this->db = mysql_connect('127.0.0.1', 'root', '');
        mysql_select_db('test', $this->db);
    }

    public function getDb() {
        return $this->db;
    }
}

//Stackable是Threaded的一個別稱,直到pthreads v.2.0.0
class Query extends Threaded {
    private $sql = '';
    private $data = array();

    public function __construct($sql) {
        $this->sql = $sql;
    }

    public function run() {
        //訪問線程工作對象
        $db = $this->worker->getDb();
        $res = mysql_query($this->sql, $db);
        $tmp = array();
        while($row = mysql_fetch_assoc($res)) {
            //這里不能使用$this->data[] = $row;這種方式。
            $tmp[] = $row;
        }
        $this->data = $tmp;
    }

    public function getData() {
        return $this->data;
    }
}

$mysqlWork = new MySqlWorker('mysqlWork');
$query1 = new Query('select * from test order by id limit 0,2');
$query2 = new Query('select * from test order by id limit 2,2');

//通過Worker的stack方法,我們把對象加入到Worker中
//會激活Worker執行對象的run()方法。
//說白了就是會執行$query1,$query2的run()方法。
$mysqlWork->stack($query1);
$mysqlWork->stack($query2);

$mysqlWork->start();
//執行完Worker中的對象后,關閉Worker。
//如果把這段代碼放到$query1->getData()和$query2->getData()之后
//則會輸出兩個空數組,那該方法的作用有可能是等待Worker中對象執行完畢,類似join方法()。
$mysqlWork->shutdown();

var_dump($query1->getData());
var_dump($query2->getData());
php Thread 多線程 Worker和Threaded - 懷素真 - 因上努力 果上隨緣
 
Worker對象與Threaded對象的關系有點像是,船在河中運行,一條河里有很多條船,而河也不止一條。不同的船運行在特定的環境下,比如大噸位的船是無法運行在河床淺的河中。船是可以隨時變化的,而河的環境確相對持久。我們通過stack方法把對象加入到Worker中,在對象的run方法中通過對worker的訪問來獲取信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM