2016-10-14 31 views
2

Ich arbeite an der Verbesserung eines Prozesses in PHP, also habe ich Multithreading mit Worker zum Verwalten meiner Threads verwendet. Die Threads im Worker werden jedoch nicht gleichzeitig ausgeführt.PHP - PTHREAD Worker Threads, die nicht gleichzeitig ausgeführt werden

Dies ist mein Beispielcode

namespace App\Engine\Threads\ThreadClass; 


class StatePaperAttendancePDFThread extends \Threaded 
{ 
    private $write_folder_name; 
    private $center_code; 
    private $paper_id; 
    private $title; 
    public function __construct($write_folder_name, $center_code, $paper_id, $title) 
{ 
    $this->write_folder_name = $write_folder_name; 
    $this->center_code = $center_code; 
    $this->paper_id = $paper_id; 
    $this->title = $title; 

} 


public function run(){ 

    echo " Retrieving paper attendance ".$this->center_code." ".$this->paper_id." ".\Thread::getCurrentThreadId()." ".date("H:i:s:u").PHP_EOL; 
    $artisan = 'C:/xampp/htdocs/attendance/artisan'; 
    $cmd = "php $artisan attendancereport:center $this->write_folder_name $this->center_code $this->paper_id $this->title"; 
    $return = exec($cmd, $output, $return_var); 
    echo $return; 

} 
} 


foreach ($centers as $i=>$center){ 
     $center_code = $center->getCenterCode(); 
     $thread = new StatePaperAttendancePDFThread($folder_name, $center_code, $paper_id, $title); 
     $worker->stack($thread); 
    } 

$worker->start(PTHREADS_INHERIT_ALL^PTHREADS_INHERIT_CLASSES); 
$worker->shutdown(); 

aber wenn ich es von der CLI mit der Zeit gedruckt worden überwachen kann ich, dass keiner der Fäden beginnt zusammen sehen. Sie beginnt mit einigen Sekunden Intervall

Bitte, was mir fehlt

+0

Soweit ich es verstehe, führen Arbeiter die gestapelten 'Threaded' Objects aka Stackables auf einem einzigen Thread aus. Check-out http://stackoverflow.com/questions/15955886/what-is-the-difference-between-thread-object-and-worker-object-php-pthreads. Du brauchst wahrscheinlich entweder einen [Thread/Worker Pool] (http://stackoverflow.com/a/23602185/3828957) oder starte deine Threads wenn möglich mit '$ thread-> start'. Da ich kein konkretes Wissen habe, ist das eher eine Idee und keine Antwort. – makadev

+0

Danke @makadev mit Pool funktioniert nicht für mich Ich bekomme keine Serialisierung Closure, weil ich einige Parameter zu Beginn des Threads übergeben müssen und wir wissen, Pool hat keine Startfunktion –

Antwort

1

konnte ich mein Problem lösen, indem eine angepasste Thread Pool Executor wie unten zu schaffen. Bitte ich bin offen für Vorschläge und Verbesserungen

Ich werde jede Ergänzung oder Korrektur zu schätzen wissen.

Verwandte Themen