теория многопоточности

kaiser Zaido

Новичок
теория многопоточности

Помогите мне плз понять как работает многопоточность на приведенном примере.

Допустим мой скрипт обрабатывает файлы, есть список файлов и он их тупо обрабатывает - обработал один, переходит к другому, и так до конца, пока не закончатся. Если я захочу разбить на потоки этот понотонный процесс и напишу где-нить в начале скрипта
PHP:
$pid = pcntl_fork();
if ($pid == -1) {
     die("could not fork");
} else if ($pid) {
     // we are the parent
} else {
     // we are the child
}
То что произойдет? :) Станут ли 2 процесса обрабатывать один файл в разные промежутки вемени процессорного? Если так то я думаю что это еще хуже чем просто так.
Или второй процесс идет на файл вперед и обрабатывает его? Если так то это интеллектуально очень и возможно вероятно только в мечтах :))

Что произойдет?? помогите мне плз...
 

white phoenix

Новичок
Список файлов в массиве? Задай число потоков, и выдай каждому часть элементов (count($array)/$maxthread)). Как работать с потоками - [m]pcntl[/m]. Но в скорости ты немного выиграешь, т.к. потоки нужно использовать при операциях либо разнонаправленых, либо при операциях с ожиданием чего-то независящего от программы. На твоем месте я бы всё в 1 поток обрабатывал.
 

kaiser Zaido

Новичок
почитал эту темку http://phpclub.ru/talk/showthread.php?s=&threadid=75712&highlight=pcntl, немного понял. немного это к сожалению ключевое слово :)
Я понял что разделять код между потомкамии надо по их ИД, но непонял в каком месте :) Получается или получилось форканутся или нет или чайлд, зачемто пишутся их ид в массив(зачем?). Главный вопрос как разделить обрабатываемые объемы между процессами, как каждому процессу самоосознать себя и понять какой именно кусок массива ему надо обрабатывать.

Еще вопросец - если все процессы захотят писать в файлы одни и теже, то там получится полная неразбериха(да/нет). Если эти файлы блокировать на время записи то все утрясется и несильно замедлится(да/нет).


Очень буду ждать аналитики :)) буду рад ответам
(уже начал ждать)
 

kaiser Zaido

Новичок
тили бом тили бом :) Неужели никто нерискнет поделится мудростью? :)

Мне это затем чтобы быстрее работало :)
 

neko

tеam neko
шас поделюсь, только сначала ответь мне на один вопрос.
тебе файлы все равно в каком порядке обрабатывать?
 

neko

tеam neko
понятно
тогда напиши шелл-скрипт который запускает этот обработчик с путем к файлу который нужно обработать.
и запусти их сразу штук 20.
 

kaiser Zaido

Новичок
верно, такое решение елозило в черепе, в принципе я реализовывал такой метод многопоточности, но скриптом надо пользоватся другим людям еще, им как быть? :)
в принципе можно запускать шел скрипт из пхп, тоже вариант, спасибо...
 

neko

tеam neko
да это лучший вариант
потому что ничего городить не нужно из этих pcntl-ей
во всех почти шелах есть простой механизм работы с заданиями
 

kaiser Zaido

Новичок
Нашел вроде бы функциональную функцию
PHP:
thought you guys may appreciate this function, allows you to pass an array of urls to download and does so simultaneously using non-blocking sockets, then returns the data in an array.

// function connects to an array of URLS at the same time
// and returns an array of results.

function multiHTTP ($urlArr) {
$sockets = Array(); // socket array!
$urlInfo = Array(); // info arr
$retDone = Array();
$retData = Array();
$errno  = Array();
$errstr  = Array();
for ($x=0;$x<count($urlArr);$x++) {
 $urlInfo[$x] = parse_url($urlArr[$x]);
 $urlInfo[$x][port] = ($urlInfo[$x][port]) ? $urlInfo[$x][port] : 80;
 $urlInfo[$x][path] = ($urlInfo[$x][path]) ? $urlInfo[$x][path] : "/";
 $sockets[$x] = fsockopen($urlInfo[$x][host], $urlInfo[$x][port],
                          $errno[$x], $errstr[$x], 30);
 socket_set_blocking($sockets[$x],FALSE);
 $query = ($urlInfo[$x][query]) ? "?" . $urlInfo[$x][query] : "";
 fputs($sockets[$x],"GET " . $urlInfo[$x][path] . "$query HTTP/1.0\r\nHost: " .
      $urlInfo[$x][host] . "\r\n\r\n");
}
// ok read the data from each one
$done = false;
while (!$done) {
 for ($x=0; $x < count($urlArr);$x++) {
  if (!feof($sockets[$x])) {
  if ($retData[$x]) {
    $retData[$x] .= fgets($sockets[$x],128);
  } else {
    $retData[$x] = fgets($sockets[$x],128);
  }
  } else {
  $retDone[$x] = 1;
  }
 }
 $done = (array_sum($retDone) == count($urlArr));
}
return $retData;
}
вродебы должна работать по описанию и по коду ))
для теста написал скрипт который вызываю 3 раза с разными параметрами

PHP:
<?php
$from=$_GET['from'];
$to=$_GET['to'];
$time=mktime();

$fp = fopen("lock.txt", "a+");

if (flock($fp, LOCK_EX)) { // do an exclusive lock
    fwrite($fp, "$from $to $time\n");
    flock($fp, LOCK_UN); // release the lock
} else {
    echo "Couldn't lock the file !";
}

fclose($fp);

echo "done...ok";


?>
На выходе получаю один нормальный результат и 2 результата "302" о том что скрипт перенесен.

вопрос который стучится об мой череп изнутри - ПОЧЕМУ?

-~{}~ 23.01.06 21:45:

плз помозгуйте и помогите мне :'(

-~{}~ 25.01.06 22:02:

последний раз поднимаю тему в надежде на разумные комментарии
 
Сверху