(Первая проблема ниже)
Наконец-то сделал так, как хотел! Что за головная боль ^^
Не используя бассейн был ответ;)
Итак, вот мой код, вывод ниже!
Как вы можете видеть на выходе, я получил работу равномерно распределить между работниками 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
Задача ещё не решена.
Других решений пока нет …