Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Многопоточность


Автор: Another 9.5.2009, 00:18
Как разбить выполнения скрипта на потоки?

Автор: masp 9.5.2009, 00:21
через Мysql  например и крон ....
например
http://anarhist.name/scripts/est-li-mnogopotochnost-v-php/

Автор: nerezus 10.5.2009, 19:28
Цитата

Как разбить выполнения скрипта на потоки?
 Никак. Глупо задавать такие вопросы в раздел, не умея использовать поиск. Тогда бы и тему не пришлось создавать.

Цитата

через Мysql  например и крон ....
например
 Никак. Нельзя эмулировать shared state.
Дать ссылок на википедию, на кучу терминов типа многопоточности, многозадачности, определения процессов и т.д., чтобы не путаться в них?

Автор: gta4kv 10.5.2009, 20:23
nerezus, зря ты так прям. Никто не говорит о настоящей многопоточности, а как эмуляция? =)

http://php.net/pcntl-fork

Автор: nerezus 10.5.2009, 22:00
gta4kv, нельзя. Это процессы.
А как же общие переменные, к примеру?

пусть 1 поток по циклу увеличивает переменную, а второй ее печатает.
+ чтобы под виндой работало, т.к. я на винде разрабатываю на ноуте.
    


Автор: gta4kv 10.5.2009, 22:32
Я вообще хз, у меня есть только кусочек теории. Подобными глупостями я на PHP не занимаюсь.

Автор: nerezus 11.5.2009, 01:00
gta4kv, 
Цитата

Я вообще хз, у меня есть только кусочек теории. 
 Поверь, что это невозможно.

Автор: icewind 12.5.2009, 14:03
Послушайте nerezus, и не ищите статьи энтузиастов с громкими названиями "МНОГОПОТОЧНОСТЬ НА PHP!!!!" Это по определению не возможно. Если очень нужно, используйте соответствующий инструмент, который обладает подобным функционалом. И не путайте потоки и процессы. От форканья процессов толку много не будет. 

Автор: mogul82 16.5.2009, 23:11
А мне говорили можно. 
С пшп 5 мона мол с интерпритатором работать (и изменять код интерпретатора) и там можно отправить кусок кода на др поток. А там уж как операционка захочет.

Автор: nerezus 16.5.2009, 23:14
Цитата

А мне говорили можно. 
 А мне говорили, что в москве кур доят.

Если по жизни будешь пытаться выдать "бабка в трамвае сказала" за правду, то ничего не выйдет. Просто совет.

Автор: eXed 22.7.2009, 15:30
А зачем WEB языку PHP многопоточность? 

В случаях, когда нужно что делать быстрей и не дожидаться запросов к Вебсерверу?

Существует, как сказали выше базы данных и cron, но если очень хочется, можно запускать на сервере подобный скрипт:

Код

while(true)
{
if( DB->SELECT('etc') )
{

}
sleep(10000);
}


правда не факт, что он не съест все ресурсы системы smile 

Вот более полное описание данного процесса http://leonid.shevtsov.me/20-09-2008/mnogoprocessovye-demony-na-php/

Автор: nerezus 22.7.2009, 21:03
Цитата

А зачем WEB языку PHP многопоточность? 
 Новости агрегировать, к примеру. Куча вариантов.
Факт в том, что она нужна.

Запомни: если что-то не нужно тебе. это не значит, что оно не нужно никому.

А еще сходи-ка ты на википедию и почитай определение терминов, а то и дальше будешь путать потоки с процессами.

Автор: eXed 23.7.2009, 03:39
Цитата

 Новости агрегировать, к примеру. Куча вариантов.
Факт в том, что она нужна.


Хочется одним запросом к скрипту обращаться сразу к 10 сайтам в 10 потоках и хавать новости?

Или одним потоком генерить темплейт, а другим контент и на выходе это совмещать. Здорово конечно, 
но что мы получим при тысячах запросов к таким скриптам, как производить отладку и т.д. ?
В данном случае имеется ввиду PHP+WebServer запуск по запросу, а не о резидентном консольном приложении.

Цитата

... дальше будешь путать потоки с процессами. 


Я не путаю понятия, хотя на вики сходил... "Многопоточность (как доктрину программирования) не следует путать ни с многозадачностью, ни с многопроцессорностью, несмотря на то, что операционные системы, реализующие многозадачность, как правило реализуют и многопоточность."  smile "Шла Саша по шоссе и сосала сушку"  smile 

Автор: nerezus 23.7.2009, 04:20
Цитата

Хочется одним запросом к скрипту обращаться сразу к 10 сайтам в 10 потоках и хавать новости?
 Да. И потом все полученное в 1 массив для дальнейшей обработки.

Цитата

но что мы получим при тысячах запросов к таким скриптам, 
 Тысячах? Достаточно нескольких десятков потоков чтобы оценить возросшую производительность

Цитата

как производить отладку и т.д. ?
 Не поверишь. С помощью дебаггера.
Имел то опыт работы с потоками?)

Автор: eXed 23.7.2009, 04:29
Цитата

 Да. И потом все полученное в 1 массив для дальнейшей обработки.


Наткнулся на статью http://seoutils.net/archives/187

Цитата

Имел то опыт работы с потоками?) 


Имею опыт программирования на C#.

Автор: Riddick 6.8.2009, 09:53
На пхп многопоточности нет ФАКТ.
Как вариант по никс*
Код

<?php
Error_Reporting(E_ALL & ~E_NOTICE);
ini_set ('max_execution_time', '0');
ini_set ('max_time_limit', '0');

$thread='10';//Количество потоков
for ($i=1; $i <= $thread; $i++){
       exec("sript.php?thread=$i);//Запуск скрипта в фоновом режиме с указанием потока
       flush();
}
echo "Процесс стартанул";
?>

В этом случае остается контролировать выполнение каждого экземпляра скрипта, что весьма неудобно и этот вопрос я думаю решаем с помощью Ajax (как вариант). Для особо придирчивых уточняю что понятьи поток здесь рассмотрено в контексте "Экземпляр скрипта";
Поехали дальше. Многие пишут под  виндовозом. С виндой есть другой вариант - а именно командная строка
Код

<?php
Error_Reporting(E_ALL & ~E_NOTICE);
ini_set ('max_execution_time', '0');
ini_set ('max_time_limit', '0');

$start = "start /MIN z:/php5/php.exe -c z:/php5/php.ini -f  sript.php?thread={thread}"; //Путь к интерпритатору+путь к ини+путь к скрипту
$thread='10';//Количество потоков
for ($i=1; $i <= $thread; $i++){
       $thread = str_replace("{thread}", "$i", $start);//Получаем строку для запуска экземпляра скрипта
       pclose(popen($thread, 'r'));//Запускаем экземпляр скрипта
       flush();
}
echo "Процесс стартанул";
exit();

В этом примере каждый экземпляр скрипта будет открыт в видимой командной строке, что позволяет смотреть работу скрипта.
Вот типа и все.
Есть еще вариант запускать экземпляры скрипта через сокеты, где количество сокетов будет равно "количеству потоков";

Да и насчет форков. Сильно не усердствуй с ним на пхп (сильная нагрузка на сервер) - это прерогатива Perl.
 smile 

Автор: nerezus 6.8.2009, 10:30
Riddick, ты путаешь понятия потока и процесса. Это все равно, что путать палец с... мордой.

Автор: Riddick 6.8.2009, 10:55
Я смотрел на контекст вопроса ТС, и ему думаю подойдет то что я предложил.
А вот как он рассмотрит это - дело уже его. 
To -> nerezus
Я же сказал на пхп многопоточности нет - то что я описал это эмуляция - но смотря чего и как на это смотреть. Если рассматиривать правильно то каждый раз мы порождаем новый процесс - работающий в один поток - отсюда можно сделать вывод (и он правильный)что мы занимаемся не многопоточностью а плодим процессы. С другой стороны если рассмотреть скрипт порождающий процессы (а процесс работает в один поток) основным и в конечном итоге порождающий потоки(пусть с возникновением новых процессов), то выходит что скрипт многопоточен.
Я здесь не пытаюсь оспорить понятия многопоточности так как многопоточность должна быть и есть в одном процессе, а у нас процессов столько же сколько и потоков, просто если подойти к вопросу философски то все можно "притянуть за уши"; 

Автор: nerezus 6.8.2009, 11:28
Цитата

то что я описал это эмуляция

Процессы - это эмуляция потоков? Порой кажется, что я в своей жизни пропустил что-то важное... А может и не я.

Цитата

то выходит что скрипт многопоточен.
 Не выходит и даже не входит. Где shared state? Измененные переменные в одном "потоке" изменятся в другом? Это основной признак тредов, и он не выполняется. Так что говорить о какой-то "эмуляции" просто некорректно.

Автор: Riddick 6.8.2009, 13:10
 smile 

Автор: Pori 19.8.2009, 18:40
nerezus, как вариант, юзать темп файл для хранения общих переменных ;) 

Чего ты так взъелся? Никто ж с тобой не спорит, что нету на PHP многопоточности. Но зайди на любую фриланс биржу - каждому второму заказчику скрипта на PHP подавай многопоточность. Им же не объяснишь =) Вот и приходится выкручиваться как получиться, а не как теоретически правильно ;)

Автор: nerezus 19.8.2009, 19:21
Pori, и? каждую строчку оборачивать кодом с чтением этого файла? С блокировкой его?
Так если он блокируется, многопоточности то и не будет ;)

А если не блокируется - то данные испортятся.

Цитата

Вот и приходится выкручиваться как получиться, а не как теоретически правильно ;)
 эффекта не будет

Автор: Pori 19.8.2009, 19:34
Конешн с блокировкой, а как иначе? =)

Тормозить процесс пока не получит доступ к файлу, а потом вперед. Не известно же в какой момент процессы запросят доступ к файлу. Может, правдо, и повезти - выстроятся в конвейер ;)

Да, конечно, это не многопоточность. Да и, как правило, для того, что требуют заказчики с пометкой "должно работать многопоточно" многопоточность совершенно не требуется. Недавно попался мне такой - я предложил в качестве многопоточности запускать скрипт несколько раз по крону - согласился ;) Вот и вся многопоточность на PHP.

Автор: nerezus 19.8.2009, 20:08
Цитата

Да, конечно, это не многопоточность.
 ЧТД.

Цитата

Да и, как правило, для того, что требуют заказчики с пометкой "должно работать многопоточно" многопоточность совершенно не требуется.
 А если потребуют бабушку прирезать?)

Автор: IZ@TOP 20.8.2009, 11:00
Цитата(nerezus @  19.8.2009,  21:08 Найти цитируемый пост)
А если потребуют бабушку прирезать?) 

Предложим вместо нее девственницу  smile И не прирезать...  smile 

Автор: NewDima 25.8.2009, 17:48
Есть одна интересная http://www.ibm.com/developerworks/ru/library/os-php-multitask/index.html

Автор: Pori 27.8.2009, 21:23
ну так мы это, вроде, здесь разобрали. Просто там все структурированно и довольно неплохо написано

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)