Как многопоточность с pThreads в PHP7? рабочие, бассейн и т. д.

В настоящее время я хочу изучить и реализовать pthreads — github. Я собрал php7 с необходимыми компонентами и проверил, что thread-safety включен. Мой текущий пример кода имеет 4 дочерних класса, которые принадлежат родительскому классу Canine, Как я должен назвать Thread класс соответственно выполнить bark() из всех классов, показанных ниже в то же самое? Имея в виду способность масштабироваться, когда классы увеличиваются с 4 до 100. Бассейны? Рабочие?

 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();

4

Решение

Я полагаю, что ваша проблема связана с архитектурой решения, т. Е. Вам придется где-то расширять класс Thread и не знать, где.

Предполагая, что структура класса (Helper, DataAccessObject) является конечной и что нет смысла расширять DataAcessObject с помощью Thread, я бы сделал это следующим образом.

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();
}

Я думаю, что это хороший способ, потому что он не заставляет Canine быть нитью, так как он не обязательно должен быть нитью все время.

РЕДАКТИРОВАТЬ

Я забыл упомянуть, в первоначальном ответе, что если вы хотите масштабировать до сотен потоков, да, вы должны использовать Pool а также Worker классы, чтобы справиться с этим (документы даже рекомендую использовать Worker вместо Thread), иначе запуск 100 потоков одновременно не будет хорошим (и ухудшится, если у вас несколько клиентов): P

Как только вы научитесь лучше использовать потоки, вы сможете перейти к этим сценариям.

Надеюсь, поможет 🙂

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]