Я хочу использовать некоторые потоки, чтобы мои вычисления и мой веб-сервис работали быстрее.
не углубляйтесь в вычисления, это работает правильно. Тем не менее, моя проблема в том, что без использования этого потока это заняло что-то около 55 секунд, хотя теперь это снова что-то около 55 секунд.
Так что мне интересно, правильно ли я это использую?
Это правильная форма использования pthreads?
Моя версия php: 5.5.12
class workerThread extends Thread {
public function __construct($eng,$year,$capacity){
$this->eng = $eng;
$this->year = $year;
$this->capacity = $capacity;
}
public function run(){
$counter=0;
$paye1=0;
$paye2=0;
$paye3=0;
foreach($this->eng as $engs){
$data=filter_engs($engs['id'],$this->year,$this->capacity);
if(isset($data['state'])){
if($engs['checkLevel']=='one'){
$paye1++;
$list[$counter]['avgCap']='2304';
$list[$counter]['avg']=ceil(($data['cheked']/2304)*100);
$list[$counter]['fullavg']=ceil(($data['cheked']/$data['allWork'])*100);
}else if($engs['checkLevel']=='two'){
$paye2++;
$list[$counter]['avgCap']='1728';
$list[$counter]['avg']=ceil(($data['cheked']/1728)*100);
$list[$counter]['fullavg']=ceil(($data['cheked']/$data['allWork'])*100);
}else if($engs['checkLevel']=='three'){
$paye3++;
$list[$counter]['avgCap']='1152';
$list[$counter]['avg']=ceil(($data['cheked']/1152)*100);
$list[$counter]['fullavg']=ceil(($data['cheked']/$data['allWork'])*100);
}
$list[$counter]['allWork']=$data['allWork'];
$list[$counter]['wCap']=$data['wCap'];
$list[$counter]['cheked']=$data['cheked'];
$list[$counter]['design']=$data['wCap']-$data['cheked'];
$list[$counter]['countCheked']=$data['countCheked'];
$list[$counter]+=$engs;
$counter++;
}
}
return $list;
}
}
И вот как я это использую:
$worker=new workerThread($eng,$year,$cap);
$list=$worker->run();
$worker->kill();
//and doing some stuff with $list array
Вы не должны звонить run()
непосредственно, как он будет запускать код в основном потоке.
Вам следует позвонить start()
который создаст новый поток вместо этого, и этот новый поток будет выполняться run()
,
Ты можешь использовать join()
позже подождать, пока темы закончат свою работу.
Дополнительно, run()
не должен ничего возвращать. Вы должны использовать общие ресурсы и синхронизацию, чтобы сделать готовое состояние доступным для основного потока.
Пример:
<?php
class WorkerThread extends \Thread
{
private $eng;
private $year;
private $capacity;
private $list = array();
public function __construct($eng, $year, $capacity)
{
$this->eng = $eng;
$this->year = $year;
$this->capacity = $capacity;
}
/**
* Replace with your code
*/
public function run()
{
sleep(2); // thread running this will sleep for 2 seconds
$this->list = array('chocolate', 'banana', 'pistachio');
}
public function getList()
{
return $this->list;
}
}
$worker = new WorkerThread("Lorem", "Ipsum", "FooBar");
var_dump($worker->getList()); // should be empty
$worker->start();
// ... do some other stuff ...
$worker->join(); // main thread waits for WorkerThread to complete
var_dump($worker->getList()); // should have "chocolate", "banana", "pistachio"
Других решений пока нет …