PHP - PTHREAD工作线程不同时执行

时间:2016-10-14 10:32:49

标签: php multithreading pthreads

我正在努力改进php中的进程,所以我使用Worker来使用多线程来管理我的线程。但是worker中的线程一个接一个地执行,而不是同时执行。

这是我的示例代码

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

但是当我使用打印时间从CLI监视它时,我可以看到没有一个线程一起启动。它们都以几秒钟的间隔开始

请问我缺少什么

1 个答案:

答案 0 :(得分:1)

我能够通过创建自定义线程池执行器来解决我的问题,如下所示。我愿意接受建议和改进

class ThreadPoolExecutor{
   private $poolSize;
   private $threadPool;
   private $done = false;
   private $workingThreads;

public function __construct($poolSize, array $threadPool)
{
    $this->poolSize = $poolSize;
    $this->threadPool = $threadPool;
}

public function execute()
{
    $this->parametersOk();

    try {
        while (!empty($this->threadPool)) {
            $this->extractThreads();

            foreach ($this->workingThreads as $thread) {
                $thread->start(PTHREADS_INHERIT_ALL ^ PTHREADS_INHERIT_CLASSES);
            }

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

        }
        $this->done = true;
    } catch (\Exception $ex) {

        var_dump($ex->getMessage());
    }

}


private function parametersOk()
{
    if (!is_array($this->threadPool))
        throw new \RuntimeException("threadPool expected to be an array of threads");
    if (count($this->threadPool) <= 0)
        throw new \RuntimeException("expected at least an element in threadPool");

    foreach ($this->threadPool as $thread) {
        if (!is_subclass_of($thread, \Thread::class, false)) {
            throw new \RuntimeException(" an element of threadPool does not extend class \\Thread");
        }

    }

    if ($this->poolSize > count($this->threadPool)) {
        throw new \RuntimeException("The number of threads set to execute can not be greater than the threadPool");
    }

    return true;
}

private function extractThreads()
{
    $this->workingThreads = [];
    $this->workingThreads = array_slice($this->threadPool, 0, $this->poolSize);

    for ($i = 0; $i < count($this->workingThreads); $i++) {
        array_shift($this->threadPool);
    }
}

public function isDone()
{
    return $this->done;
}


}

我将不胜感激任何补充或更正。