PHP pthreads подсчитывает активные потоки?

#php #multithreading #pthreads

#php #многопоточность #pthreads

Вопрос:

Я хочу написать некоторый PHP-код с помощью pthreads. Для этого pthreads мне нужно знать, сколько потоков активно. Потому что следующая система может обрабатывать только фиксированное количество запросов. Я могу посчитать запущенные потоки, но я не могу вычесть, когда поток остановился.

Я пытался посчитать с помощью count для объекта threads, но я также не вычитаю. Как я могу управлять тем, что я получаю информацию в свой стартовый скрипт, если поток завершил свою работу?

Комментарии:

1. Не уверен, поможет ли это, у меня ограниченные знания о pthreads, но некоторое время назад я использовал i и создал таблицу в БД с номером потока и логическим значением (с именем Busy). Когда поток запускается, он записывает в таблицу True, а непосредственно перед завершением записывает false. Затем вы можете в любое время обратиться к этой таблице, чтобы увидеть, какие потоки используются.

Ответ №1:

Я нашел способ получить информацию о запущенных и не запущенных потоках. Так что я могу их посчитать. Если у кого-то есть лучшее решение, я рад его видеть. Но сначала я хочу поделиться своим собственным решением.

 #!/usr/bin/php
<?php
class AsyncOperation extends Thread
{
    public function __construct($threadId)
    {
        $this->threadId = $threadId;
    }

    public function run()
    {
        printf("T %s: Sleeping 3secn", $this->threadId);
        sleep(1);
        printf("T %s: Hello Worldn", $this->threadId); 
        $this->kill;
    }
}
$a=0; 
$start = microtime(true);
for ($i = 1; $i <= 5; $i  ) {
    $test[$i] = new AsyncOperation($i);
    $test[$i]->start();
}
$arg=true;
while($arg){
    $arg=false;
    foreach($test as $key => $object){
//    for ($i = 1; $i <= 5; $i  ) {
        $arg2=$object->isRunning();
        if($arg2){
            $arg=$arg2;
        }else{
            //var_dump($key);
            unset ($test[$key]);
        }
//var_dump($key);
if(!$arg){
var_dump($arg);
}
    }
}
var_dump($test);
echo count($test)."n";
echo "n".microtime(true) - $start . "n";
echo "endn";
  

Ответ №2:

похоже, что вам нужен пул потоков. это может быть интересно прочитать.

класс пула — это коллекция рабочих потоков. с регулируемым количеством потоков вы можете настроить пул с определенным количеством рабочих потоков для выполнения списка заданий многопоточным способом.

допустим, вы хотите создать только 3 потока, работающих над 10 заданиями.

 <?php

class MyWork extends Threaded {

    public $name;

    public function __construct($name) {
        echo "Constructing worker $name n";
        $this->name = $name;
    }

    public function run() {
        echo "Worker $this->name start runningn";
        $strMem = '[mem:' . (memory_get_usage(true) / 1024 / 1024). 'MB]';

        for ($i = 1; $i <= 5; $i  ) {
            /*
                random delay is to simulate different time it takes for this worker to process the job.
                in the real work, this is where the job is done
            */
            $delay = rand(1,5); //busy... busy...

            echo "Worker $this->name : $i process in [$delay s] $strMem  n";
            sleep($delay);
        }
    }
}

class MyWorker extends Worker {
    public function run() {}
}

    ini_set('max_execution_time', 7200);
    ini_set('output_buffering ',0);

    $sJob = "A";//starting job
    $iMaxJob = 10;//max job
    $iMaxThread = 3;//create a pool for 3 worker;

    $pool = new Pool($iMaxThread); 

    //start queing jobs;
    for ($i=1; $i <= $iMaxJob; $i  ){
        $pool->submit(new MyWork($sJob  ));
    }

    $pool->shutdown();
    $strMem = '[peak:' . (memory_get_peak_usage(true) / 1024 / 1024). 'MB]';

    echo "done. " . $strMem;

?>