Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Паралелльные процессы в PHP
Покинул форум
Сообщений всего: 245
Дата рег-ции: Сент. 2007 Откуда: Казань
Помог: 0 раз(а)
Товарищи, не бросайте меня )))
Тот код, что я приводил выше был взят с какого-то сайта и был неоправданно отягащен...
Как параллелить процесс я понял, однако вот проблема в другом: каждый порожденный процесс у меня работает с базой данных MySQL, и казалось бы первый отработавший процесс должен завершить соединение с ней, отрубив от MySQL оставшиеся, НО!!!
Не знаю почему из пяти параллельных дочерних процессов соединение может отрубиться после двух, трех или четырех процессов??? - Т.е. соединение с MySQL разрывается НЕ после первого процесса и "поработать" с ней успевает каждый новый раз разное количество процессов.
Я ничего не понимаю! Объясните, пожалуйста в чем дело!
SergeantPEPPER
Отправлено: 03 Апреля, 2008 - 08:16:08
Частый гость
Покинул форум
Сообщений всего: 245
Дата рег-ции: Сент. 2007 Откуда: Казань
Помог: 0 раз(а)
Ну, пообщаюсь немного сам с собой...
О причине такого странного поведения я догадался:
Так как соединение с MySQL рвется только ПОСЛЕ окончания работы с ним первого (самого быстрого) процесса, то можно предположить, что в промежутке между началом работы с MySQL и окончанием этого процесса , успевают воспользоваться текущим соединением и несколько других параллельных процессов. Ну и логично тогда, что каждый новый раз это число будет случайным... (ну или псевдослучайным)
Жаль, но проблема все же остается. Соединение с MySQL рвется и я с этим ничего поделать не могу, блин, я облазил кучу форумов и FAQ-ов, но ответа нигде нет...
А постояннам соединением через mysql_pconnect пользоваться не хочется (да в общем-то и не помогло)
Если кто-нибудь сталкивался с этим, НАПИШИТЕ please
EuGen
Отправлено: 03 Апреля, 2008 - 10:34:44
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
А в чем задача, не ясно. Вам нужно, чтобы при наличии установленного соединения с БД в одном из процессов, другие процессы не могли соединиться с БД, или как?..
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
SergeantPEPPER
Отправлено: 04 Апреля, 2008 - 07:58:05
Частый гость
Покинул форум
Сообщений всего: 245
Дата рег-ции: Сент. 2007 Откуда: Казань
Помог: 0 раз(а)
Ну для начала, я хотел бы сделать такую программу:
Главный процесс создает n дочерних процессов и следит за правильностью их выполнения. Каждый дочерний процесс пишет какую-то уникальную информацию в таблицу базы данных (пусть это будет просто строка в таблице). После того, как все эти процессы отработают главный выполняет еще что-то и закрывает соединение с MySQL.
При этом: соединение с MySQL открывается в начале главного процесса. Первый (самый быстрый) дочерний процесс после общения c MySQL это соединение завершает и MySQL становится недоступным для остальных. Так вот, моя задача в том, чтобы после отработки первого процесса соединение не завершалось (т.е. сохранялось), а закрывалось в конце гланого процесса.
EuGen
Отправлено: 04 Апреля, 2008 - 09:43:19
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
То есть Вы хотите, чтобы все потомки родительского процесса работали с одним соединением с БД?
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
SergeantPEPPER
Отправлено: 04 Апреля, 2008 - 12:20:38
Частый гость
Покинул форум
Сообщений всего: 245
Дата рег-ции: Сент. 2007 Откуда: Казань
Помог: 0 раз(а)
Да, именно так.
EuGen
Отправлено: 04 Апреля, 2008 - 13:21:39
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Приведите, пожалуйста, кусок кода, где Вы работаете с соединением с БД (то есть как Вы обрабатываете его) и как Вы распараллеливаете процесс (я так понял, что Вы это делаете уже не так, как приведен Ваш пример выше).
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
expired
Отправлено: 04 Апреля, 2008 - 19:01:43
Новичок
Покинул форум
Сообщений всего: 14
Дата рег-ции: Март 2008
Помог: 0 раз(а)
хм, странно я видел люди пытались сделать что то подобное для кроны,
и для интернет чата,
а для чего вам это нужно?
SergeantPEPPER
Отправлено: 05 Апреля, 2008 - 15:48:02
Частый гость
Покинул форум
Сообщений всего: 245
Дата рег-ции: Сент. 2007 Откуда: Казань
Помог: 0 раз(а)
Извиняюсь за длительную задержку.
Вот код (здесь все дочерние процессы работают через функцию child_main):
// в $status передалась информация статуса процесса (при выходе)
$pid = pcntl_wait ($status);
// есть ли статус успешного выхода
if (pcntl_wifexited ($status))
{
$code = pcntl_wexitstatus ($status);
echo "Process $pid return exit code: $code\n";
} else {
echo "Process $pid was force destroyed\n";
}
}
А понадобилось мне это, чтобы решить проблему, которая уже отпала...
НО ради интереса и опыта хочу все-таки найти решение данного вопроса.
Мне нужно было забирать информацию сразу с нескольких веб-адресов, а так как задержки в Интернете в данном случае Очень существенны - последовательный способ работы приложения становится крайне невыгодным. Можете с этим поспорить...
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.