PDA

Просмотр полной версии : Это многопоточность ? ))


Велемир
27.03.2009, 14:55
<?php

$urls = array();
$urls[0] = "http://www.wiw.ru";
$urls[1] = "http://www.google.ee";
$urls[2] = "http://www.google.ee";
$urls[3] = "http://www.google.ee";
$urls[4] = "http://www.google.ee";
$urls[5] = "http://www.google.ee";
$urls[6] = "http://www.google.ee";

$mh = curl_multi_init();

foreach ($urls as $i => $url) {
$conn[$i] = curl_init(trim($url));
curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle ($mh,$conn[$i]);
}

// start performing the request
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active and $mrc == CURLM_OK) {
// wait for network
if (curl_multi_select($mh) != -1) {
// pull in any new data, or at least handle timeouts
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}

if ($mrc != CURLM_OK) {
print "Curl multi read error $mrc\n";
}

// retrieve data
foreach ($urls as $i => $url) {
if (($err = curl_error($conn[$i])) == '') {
$res[$i]=curl_multi_getcontent($conn[$i]);
} else {
print "Curl error on handle $i: $err\n";
}
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
}

curl_multi_close($mh);

print_r($res);

?>



Погуглил и решил проверить.Вроде работает,но не отображается ничего таск менеджере.Это и есть многопоточность,или же это иллюзии?)

wildshaman
27.03.2009, 14:58
Это мультикурл, запросы выполняются параллельно. По идее это многопоточность,но, насколько я знаю, в многопоточности нет. поправьте, если не так.

Велемир
27.03.2009, 15:00
Как понять нет ?) Выигрыш-то есть какой-то ? =_=,ибо другое я не осилил.

wildshaman
27.03.2009, 15:04
Как понять нет ?) Выигрыш-то есть какой-то ? =_=,ибо другое я не осилил.

Выигрыш есть, бузксловно. Так скрипт проходится сразу по 10 линкам, а не по очереди

Велемир
27.03.2009, 15:10
Ммм... Я вместо foreach() поставил цикл из for и решил выводить значение $mrc в первом цикле do while.Почему выводит -1?

$conn[$i] = curl_init(trim($urls[0]));

ЗЫ: Я это делал для того,чтобы один и тот же линк открыть n-ое число раз или послать n-ое число раз запрос.

Велемир
27.03.2009, 15:34
Проблему решил простой конструкцией:

for($i=0;$i<100;$i++) {

$urls[] = $urls[0];

}

Чет заранее не дошло...

rushter
27.03.2009, 15:59
Это жалкое подобие :)

mailbrush
27.03.2009, 16:16
Проблему решил простой конструкцией:

for($i=0;$i<100;$i++) {

$urls[] = $urls[0];

}

Чет заранее не дошло...
Многопоточность - когда потоки идут ПАРАЛЕЛЬНО. А в твоем случае - цикл. Т.е. поток за потоком, т.е. ПОСЛЕДОВАТЕЛЬНО. Это НЕ многопоточность!

geezer.code
27.03.2009, 16:29
Многопоточность - когда потоки идут ПАРАЛЕЛЬНО. А в твоем случае - цикл. Т.е. поток за потоком, т.е. ПОСЛЕДОВАТЕЛЬНО. Это НЕ многопоточность!
ок, а давай тогда пример языка, поддерживающего многопоточность, только сделай запуск потоков одновременно ;)

mailbrush
27.03.2009, 16:34
.bat
Запускаешь, н.п. несколько брутов дедов =)
+статья была на ачате о многопоточности в пхп.

nerezus
27.03.2009, 16:37
ок, а давай тогда пример языка, поддерживающего многопоточность, только сделай запуск потоков одновременно Java к примеру. Или питон(с небольшим отступлением на GIL). Или C#.

Потоки будут работать одновременно. и обладать выжным свойством: shared state.

geezer.code
27.03.2009, 16:43
Java к примеру. Или питон(с небольшим отступлением на GIL). Или C#.

Потоки будут работать одновременно. и обладать выжным свойством: shared state.
:) юмора не поняли. вопрос был не о параллельном выполнении, а об одновременном запуске, т.е. не последовательном запуске
Thread t1 =new Thread(new ThreadStart(obj.dowork));
Thread t2 =new Thread(new ThreadStart(obj.dowork));
t1.start();
t2.start();

потоки выполняются параллельно, но запускаются то последовательно.

Zedi
27.03.2009, 16:48
Многопоточность в PHP обещают в 7 версии, еще 6 толком не вышла, так что еще долго будут появляться такие темы, многопоточность это далеко не то.

nerezus
27.03.2009, 17:20
потоки выполняются параллельно, но запускаются то последовательно. Может случиться, что запустятся они одновременно. Вот схема:

Поток 1 запусекает потоки 2 и 3. Поток 2 запускает поток 4, поток 5 запускает поток 5.
Если отбросить синхронизацию менеджера потоков - то они запустятся одновременно.

Zedi
27.03.2009, 17:24
А потоки по моему везде последовательно запускаются, например тот ж ИПД брут, там видно это