PDA

Просмотр полной версии : [perl] перезапуск потоков


.::Gh0st::.
08.11.2008, 17:25
написал многопоточный скрипт, иногда бывают ситуации что потоки вылетают, написал кодес перезапуска потоков если количество меньше первоначально-заданного, но он не срабатывает, в чем может быть дело?


# проверяем вдруг какие-то потоки сдохли
$thr_cnt = threads->list();
share($thr_cnt);
if ($thr_cnt < $threads)
{
$cnt = $threads - $thr_cnt;
threads->new(\&start) for (1..$cnt);
&log("[+] NEW THREAD ADDED BECAUSE OLD ONE IS GAY-THREAD\n");
}

Digimortal
08.11.2008, 21:56
Покажи весь код, где происходит работа с потоками - по этому кусочку трудно сказать, в чем проблема.

nerezus
08.11.2008, 22:30
иногда бывают ситуации что потоки вылетают И вместо того, чтобы исправить ошибку, ты начинаешь строить костыли. чтобы обойти часть последствий?

ыыыыыыыыыыыыыы хуясебе))) +1

Kaimi
08.11.2008, 23:17
И вместо того, чтобы исправить ошибку, ты начинаешь строить костыли. чтобы обойти часть последствий?

Есть ошибки которые толком не исправить, например если используются потоки и компонент http::cookies

nerezus
09.11.2008, 02:28
Исключения?

.::Gh0st::.
09.11.2008, 14:57
nerezus
по началу у меня была проблема - forum.antichat.ru/showthread.php?p=911014
я советовался с некоторыми кодерами на perl, сказали что ошибка довольно распространенная и хз что с ней делать, ее удалось решить благодаря совету Kaimi

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

нужен будет для таких вот ситуаций:
Free to wrong pool 6cde3408 not 83770a0
эта ошибка ссылалась на
opendir DIR, $dir;
- я проблему исправил, но эта ошибка (насколько я понял из-за большой нагрузки на память) иногда возникает в случайных местах и может вырубить поток.

это было по пододу построения костылей, тем не менее, я в топике указал конкретную проблему - перезапуск потоков. как бы это нелогично ни казалось для вас таких умных ребят nerezus и balt - у меня конкретная цель, я не советов о том что баги править от вас жду. если есть чем помочь - буду очень признателен, если нет - то ваши посты оффтоп. просьба не разводить его.

.::Gh0st::.
09.11.2008, 15:04
Digimortal

my $threads = 20;

threads->new(\&start) for (1..$threads);
$_->join for threads->list;

sub start
{
my $tid = threads->tid();
print "[+] $tid THREAD STARTED\n";

my $thr = threads->object($tid);
if ($thr->is_joinable())
{
print "[+] joining $tid thread\n";
$thr->join();
}
else {print "$tid thread already joined\n";}
sleep 15;

while (1)
{

# проверяем вдруг какие-то потоки сдохли
$thr_cnt = threads->list();
share($thr_cnt);
#print "[+] $thr_cnt for $tid THREAD\n";
if ($thr_cnt < $threads)
{
$cnt = $threads - $thr_cnt;
threads->new(\&reg) for (1..$cnt);
print "[+] NEW THREAD ADDED BECAUSE OLD ONE IS GAY-THREAD\n";
}
# working part
}
}

Digimortal
09.11.2008, 22:18
Тут ошибка уже в том, что ты джойнишь объект потока внутри его же поточной функции. Вообще здесь без джойна потоков можно обойтись - просто контролировать число созданных потоков из основного потока в цикле, а в самой поточной функции делать декремент переменной $threads перед самым завершением ее работы. Но и этим путем идти не советую, гораздо лучше, проще и правильнее, как уже написал nerezus, использовать механизм обработки исключений.