Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Процесс контролирующий созданные потоки 
:(
    Опции темы
nIkTo
Дата 2.6.2010, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Необходимо создавать некоторое количество нитей, и по некоторому условию останавливать их выполнение, то есть нужен процесс контролирующий созданные потоки. Посмотрите на код :
Код

#!/usr/bin/perl -w
use strict;
use threads;
use threads::shared;

for (1..10) {
    my $thread = threads->create(\&action);
}
foreach my $thread (threads->list) {
    $thread->detach;
}

while (1) {
    my $flag = ''; # вычисляем значение
    if ($flag eq 'stop') {
    foreach my $thread (threads->list) {
      $thread->kill('KILL');
    }
    exit;
  }
  sleep 3;
}

sub action {
    # выполняем действия в потоке
}


Можно ли использовать такой подход ?

Это сообщение отредактировал(а) nIkTo - 2.6.2010, 21:15
PM   Вверх
DurRandir
Дата 2.6.2010, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



1. threads->list всегда ..returns a list of all non-joined, non-detached threads..
2. sending a signal to a thread does not disrupt the operation the thread is currently working on

Эти ограничения могут не устроить. Ну и

3. Если условие для $flag - внутренее, лучше использовать cond_wait/семафоры, а не sleep 3

Это сообщение отредактировал(а) DurRandir - 2.6.2010, 21:52
PM   Вверх
nIkTo
Дата 3.6.2010, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



DurRandir, спасибо за ответ.

1. Да, это исправил так :
Код

push @threads, threads->create(\&action);


2. Про сигналы, действительно нити дальше висят, тогда вопрос как убить эти нити ?

3. По нажатию кнопки стоп (в веб интерфейсе) производится запись статуса в конфигурационный файл. Из этого файла и нужно считывать состояние например раз в минуту и скидывать туда процесс выполнения задания, и если состояние изменится на stop то прибить созданные треды сохранить конечные данные и выйти. А вот какое это условие внутреннее или ещё какое я не знаю как характеризовать. Поэтому подскажите использование какого подхода будет более уместно в данном случае: ond_wait/семафоры или sleep ?

Это сообщение отредактировал(а) nIkTo - 3.6.2010, 16:10
PM   Вверх
DurRandir
Дата 3.6.2010, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



2. AFAIK - никак. Перловые треды - зло smile
3. Ну тут скорее всего без поллинга не обойтись. Хотя можно прикрутить inotify/kqueue, чтобы получать события и сразу на них реагировать.
PM   Вверх
nIkTo
Дата 4.6.2010, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Как на ваш взгляд такая модель имеет право на существование ? Укажите на её недостатки.
Код

#!/usr/bin/perl -w
use strict;
use threads;
use threads::shared;

# make jobs
my @jobs : shared;
push(@jobs, "job number $_")for (1..200);

my $done : shared = 0;
my $total = $#jobs+1;

# make detached threads
my @threads;
for (1..10) {
    push(@threads, threads->create('do_jobs'));
}
foreach my $thread (@threads) {
    $thread->detach;
}

# monitoring
while (1) {
  if (-f 'stop') {
    print "Pocess is stoped\n";
    threads->exit();
  }
  if ($done == $total) {
    print "Pocess is finished\n";
    threads->exit();
  }
  sleep 4;
}

sub do_jobs {
    while (1) {
    my $job;
    {
            lock @jobs;
            $job = shift @jobs || return;
        }
    my $tid = threads->tid();
    sleep int(rand(4)) + 1; # time for performance job
    print "Say thread ".sprintf("%2d",$tid).": i am done -\t".$job."\n";
    {
      lock $done;
      $done++;
    }
    }
}

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0668 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.