首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在pThreads中使用PHP7多线程?工人、水池等

如何在pThreads中使用PHP7多线程?工人、水池等
EN

Stack Overflow用户
提问于 2016-09-04 12:40:18
回答 1查看 1.3K关注 0票数 2

我目前想学习和实现P线程- github。我已经用必要的组件编译了php7,并验证了thread-safety是启用的。我的当前示例代码有4个子类,它们属于父类Canine。我应该如何相应地调用Thread类来从下面所示的所有类同时执行bark()?记住,当班级从4级增长到100级时,要有规模的能力。泳池?工人?

代码语言:javascript
复制
 class Database {
    private $_host;
    private $_user;
    private $_pass;
    private $_dbname;
    private $_dsn;
    private $_options;
    public static $pdo;
    private $error;

    private $stmt;

    public function __construct() {
        $this->_host   = 'xxxxx';
        $this->_user   = 'xxxxx';
        $this->_pass   = 'xxxxx';
        $this->_dbname = 'xxxxx';
        $this->_dsn    = 'mysql:host=' . $this->_host . ';dbname=' . $this->_dbname;
        // Set options
        $this->_options = array(
            PDO::MYSQL_ATTR_LOCAL_INFILE => true,
            PDO::ATTR_PERSISTENT         => true,
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_TIMEOUT            => 1,
        );
    }

    public function __sleep() {
        return array('_dsn', '_user', '_pass');
    }

    public function __wakeup() {
        $this->connect();
    }

    public function connect() {
        try {
            return self::$pdo = new PDO($this->_dsn, $this->_user, $this->_pass, $this->_options);
        } catch (PDOException $e) {
            $this->error = $e->getMessage();
        }
    }
}

class DataAccessObject {
    protected $database;

    public function __construct() {
        //Create Instance of DB
        $this->database = (new Database())->connect();
    }

    public function insertQuery($query) {
        try {
            $select = $this->database->prepare($query);
            $select->execute();
            $results = $select->fetchAll(PDO::FETCH_ASSOC);
        } catch (Exception $e) {
            echo "Failed: " . $e->getMessage();
        }
        return true;
    }
}

class Helper extends DataAccessObject {
//code elided
}

abstract class Canine extends Helper {
    abstract public function bark();
}

//Child Classes

class GoldenRitriever extends Canine {
    public function bark() { echo 'arf-arf!<br>'; }
}

class Pitbull extends Canine {
    public function bark() { echo 'ruff-ruff!<br>'; }
}

class GermanShepherd extends Canine {
    public function bark() { echo 'wao-wao!<br>'; }
}

class LabradorRetriever extends Canine {
    public function bark() { echo 'woof-woof!<br>'; }
}

Creating instances and invoking `bark()`

$golden_ritriever = new GoldenRitriever();
$golden_ritriever->bark();

$pitbull = new Pitbull();
$pitbull->bark();

$german_shepherd = new GermanShepherd();
$german_shepherd->bark();

$labrador_retriever = new LabradorRetriever();
$labrador_retriever->bark();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-07 15:56:06

我设想您的问题在于解决方案的体系结构,即您必须在某个地方扩展Thread类,并且不确定在哪里。

假设类结构(Helper,DataAccessObject)是最终的,并且使用线程扩展DataAcessObject是没有意义的,那么我将采用以下方式进行扩展。

代码语言:javascript
复制
class ThreadedCanine extends Thread {
    private $canine;
    public function __construct(Canine $canine) {
        $this->canine = $canine;
    }

    public function run() {
        $this->canine->bark();
    }
}

$threads = [
    new ThreadedCanine(new GoldenRitriever()),
    new ThreadedCanine(new Pitbull()),
    new ThreadedCanine(new GermanShepherd()),
    new ThreadedCanine(new LabradorRetriever()),
];

foreach($threads as $thread) {
    $thread->start();
}

foreach($threads as $thread) {
    $thread->join();
}

我认为这是一个很好的方法,因为它不会强迫一只狗成为一个线程,因为它可能不需要一直是一个线程。

编辑

我忘了在最初的答案中提到,如果您想要扩展到100个线程,是的,您应该使用PoolWorker类来管理(文档甚至是推荐来使用Worker而不是Thread),否则同时启动100个线程是不好的(如果您有多个客户端,情况会变得更糟):

一旦您更好地掌握了使用线程,您就可以转移到这些场景。

希望它有帮助:)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39317010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档