Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   [perl] перезапуск потоков (https://forum.antichat.xyz/showthread.php?t=90950)

.::Gh0st::. 08.11.2008 17:25

[perl] перезапуск потоков
 
написал многопоточный скрипт, иногда бывают ситуации что потоки вылетают, написал кодес перезапуска потоков если количество меньше первоначально-заданного, но он не срабатывает, в чем может быть дело?

Код:

# проверяем вдруг какие-то потоки сдохли
$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, использовать механизм обработки исключений.


Время: 04:09