PHP Pthread управление пулом

(Первая проблема ниже)

Наконец-то сделал так, как хотел! Что за головная боль ^^

Не используя бассейн был ответ;)

Итак, вот мой код, вывод ниже!

Как вы видите на выходе, мои рабочие места распределяются равномерно между работниками 1 и 2, в то время как работник 0 выполняет долгую работу!

<?php
class ChildThread extends Threaded {
  public $workerId;
  protected $complete;

  public function __construct($workerId){
    // init some properties
    $this->workerId = $workerId;
    $this->complete = false;
  }
  public function run(){
    // do some work
    echo "    STARTING " . $this->workerId . "\r\n";
    if($this->workerId == 0){
        sleep(10);
      } else {
        sleep(1);
      }
    echo "        ENDING " . $this->workerId . "\r\n";
    $this->complete = true;
  }
  public function isComplete() { 
      return $this->complete; 
  }
}

$WORKER_COUNT = 3;

$workers = array();
for ($i=0; $i<$WORKER_COUNT; $i++) {
  $worker = new Worker();
  $worker->start();
  $workers[] = $worker;
}

$tasks = array();
//Create 9 jobs
for ($i=0; $i < 9; $i++) { 
  $tasks[] = new ChildThread($i);
}

$cptTasks = 0;
//References for running jobs
$taskss = array();

while(count($tasks) > 0){
  foreach ($workers as $key => $worker) {
    if($worker->isShutdown()){
      echo "Shutdowned worker ".$key.", restarting it !"."\r\n";
      $worker->start();
    }
    //If worker is free of charge
    if($worker->isWorking() === false ){
      //Check if task not null
      if(isset($tasks[$cptTasks])){
        echo ("Stacking job ".$cptTasks." on worker ".$key."\r\n");
        $worker->stack($tasks[$cptTasks]);
        $taskss[] = $tasks[$cptTasks];
        //Clear job from jobs list
        unset($tasks[$cptTasks]);
        $cptTasks++;
      }
    }
  }
  usleep(2000);
}

//Clear workers
foreach ($workers as $key => $worker) {
  echo "Shutdown worker : " .$key."\r\n";
  $worker->shutdown();
}

?>

Вывод: укладка задания 0 на работника 0
Укладка работы 1 на работника 1
Укладка работы 2 на работника 2
НАЧАЛО 1
НАЧАЛО 0
НАЧАЛО 2
КОНЕЦ 1
КОНЕЦ 2
Укладка работы 3 на работника 1
Укладка работы 4 на работника 2
НАЧАЛО 3
НАЧАЛО 4
КОНЕЦ 3
КОНЕЦ 4
Укладка работы 5 на работника 1
Укладка работы 6 на работника 2
НАЧАЛО 5
НАЧАЛО 6
КОНЕЦ 5
КОНЕЦ 6
Укладка работы 7 на работника 1
Укладка работы 8 на работника 2
НАЧАЛО 7
НАЧАЛО 8
Выключение работника: 0
КОНЕЦ 8
КОНЕЦ 7
КОНЕЦ 0
Отключение работника: 1
Выключение работника: 2


Я работаю над системой pthread и пытаюсь реализовать систему пула.

В настоящее время я создаю пул из 3 работников, а затем отправляю свои задания с помощью пула->submit().

Затем pool->collect()

И пул-> выключение ()

Но я разочарован результатом.

Похоже, что рабочие места распределяются среди всех работников равномерно

Рабочий 1: рабочие места 1, 4, 7

Рабочий 2: рабочие места 2, 5, 8

Рабочий 3: рабочие места 3, 6, 9

Тогда, скажем, моя работа 1 довольно длинная, а все остальные не долго, мои работы будут закончены следующим образом:

2, 5, 3, 6, 8, 9, 1, 4, 7

Но то, что я хотел бы достичь, должно быть больше похоже на: 2, 3, 5, 4, 6, 8, 7, 9, 1

Как распределение рабочих мест ближайшему неработающему работнику, так что моя тяжелая работа выполняется на работнике 1, а все остальные работы идут на работников 2 и 3.

Это что-то выполнимое?

Я что-то здесь упускаю?

Пример кода:

    <?php

class ChildThread extends Threaded {
  public $jobId;
  protected $complete;

  public function __construct($jobId){
    // init some properties
    $this->jobId = $jobId;
    $this->complete = false;
  }
  public function run(){
    echo "STARTING " . $this->jobId . "\r\n";
    //Job ID 1 == heavy waiting
    if($this->jobId == 1){
      sleep(10);
    } else {
      sleep(1);
    }
    echo "ENDING " . $this->jobId . "\r\n";

    $this->complete = true;
  }
  public function isComplete() { 
      return $this->complete; 
  }
}


$pool = new Pool(3);
$tasks = array();

// Add tasks to pool queue
for ($i=1; $i<=9; $i++) {
  $task = new ChildThread($i);
  $pool->submit($task);
  $tasks[] = $task;
}

$pool->collect(function($work){
  return $work->isComplete();
});
$pool->shutdown();

?>

Результат:
НАЧАЛО 1
НАЧАЛО 2
НАЧАЛО 3
КОНЕЦ 2
НАЧАЛО 5
КОНЕЦ 3
НАЧАЛО 6
КОНЕЦ 5
НАЧАЛО 8
КОНЕЦ 6
НАЧАЛО 9
КОНЕЦ 8
КОНЕЦ 9
КОНЕЦ 1
НАЧАЛО 4
КОНЕЦ 4
НАЧАЛО 7
КОНЕЦ 7

0 ответов

Другие вопросы по тегам