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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Thread::Queue 
:(
    Опции темы
Guran
Дата 13.10.2011, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день. У меня возникла небольшая проблема с Thread::Queue, я не понимаю как это вообще применить. Понятного мне мануала не нашел. Может кто-нибудь может дать ссылку на подробные объяснения "на пальцах", или написать, как применять это для создания очередей тредов? (Когда тредов N а они запускаются группами по N\10)
PM MAIL   Вверх
arto
Дата 13.10.2011, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

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



Thread::Queue -- для безопасной работы с очередями в thread-окружении.
посмотрите Thread::Pool
PM MAIL ICQ   Вверх
Guran
Дата 13.10.2011, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Количество запросов постоянно меняется, от 500 до 3,5к так что максимальное для пула указать сложно. А с Queue непонятно как сделать так, чтобы при выводе не происходило ошибки из-за того, что последняя группа не 30 запросов, а, например, 17
PM MAIL   Вверх
Pfailed
Дата 13.10.2011, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Guran @  13.10.2011,  16:44 Найти цитируемый пост)
Количество запросов 

Что за запросы?


--------------------
PM MAIL   Вверх
DurRandir
Дата 14.10.2011, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



<telepate on>граббинг http с потоками, да?)</telepate off>
PM   Вверх
Guran
Дата 16.10.2011, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Код

#!/usr/bin/perl

use threads;
use strict;
use Switch;
use Net::SNMP;
use Thread::Queue;
use DBI;

my $b_ip : shared;
my $b_oid : shared;
my @mas_ip : shared;
my @mas_id_mod : shared;
my @users=0..31;
my @thread;
my @globx : shared;

my $dbh = DBI->connect("DBI:Pg:dbname=postgres;host=host",
"login", "passwd") || die $DBI::errstr;

my $query = "SELECT switch_map.switch_place2.ip_address, switch_map.models.id 
FROM switch_map.switch_place2, switch_map.sw_warehouse, switch_map.models
WHERE (switch_map.switch_place2.sw_id = switch_map.sw_warehouse.id) AND (switch_map.sw_warehouse.model_id = switch_map.models.id) AND
(switch_map.models.id IN (1,2,3,7,15));";

my $output = $dbh->prepare($query);
$output->execute;
my ($b_ip, $id_mod);
$output->bind_columns(undef, \($b_ip, $id_mod));

while ($output->fetch) {
    push @mas_ip, $b_ip;
    push @mas_id_mod, $id_mod;
}

for (my $j=0; $j<$#mas_ip; $j++){
    foreach(@users) {
        if ($j<$#mas_ip){
            switch($mas_id_mod[$j]){
                case 1 {$b_oid = "1.3.6.1.4.1.171.11.64.1.2.10.5.1.4";}
                case 2 {$b_oid = "1.3.6.1.4.1.171.11.63.6.2.7.11.1.4";}
                case 3 {$b_oid = "1.3.6.1.4.1.171.11.63.3.2.7.5.1.4";}
                case 7 {$b_oid = "1.3.6.1.4.1.171.11.63.6.2.7.11.1.4";}
                case 15 {$b_oid = "1.3.6.1.4.1.171.12.73.3.1.3.1.2";}
            }
            $b_ip = $mas_ip[$j];
            $globx[$_] = Thread::Queue->new;
            $thread[$_] = threads->create(\&kar, $b_ip, $b_oid)->join;
            $j++;
        }
    }

    foreach (@users){
        if ($j<$#mas_ip){
            switch($mas_id_mod[$j]){
                case 1 {$b_oid = "1.3.6.1.4.1.171.11.64.1.2.10.5.1.4";}
                case 2 {$b_oid = "1.3.6.1.4.1.171.11.63.6.2.7.11.1.4";}
                case 3 {$b_oid = "1.3.6.1.4.1.171.11.63.3.2.7.5.1.4";}
                case 7 {$b_oid = "1.3.6.1.4.1.171.11.63.6.2.7.11.1.4";}
                case 15 {$b_oid = "1.3.6.1.4.1.171.12.73.3.1.3.1.2";}
            }
            $b_ip = $mas_ip[$j];
            if ($globx[$_]->pending eq 0) {
                $globx[$_]->enqueue(-1);
                $thread[$_] = threads->create(\&kar, $b_ip, $b_oid)->join;
                $j++;
            }
        }
    }
}

sub kar
{
# Тут расположена сама функция, треды в ней не участвуют
}

PM MAIL   Вверх
Guran
Дата 17.10.2011, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В конце концов получилась такая штука, может кому поможет:
Код

#!/usr/bin/perl

use threads;
use strict;
use Switch;
use Net::SNMP;
use Thread::Queue;
use DBI;

my $b_ip : shared;
my $b_oid : shared;
my @mas_ip : shared;
my @mas_id_mod : shared;
my @users=0..9;
my %thread;
my %globx : shared;
my $quglb : shared;
my $j : shared = 0;

my $dbh = DBI->connect("DBI:Pg:dbname=postgres;host=host",
"login", "passwd") || die $DBI::errstr;

my $query = "SELECT switch_map.switch_place2.ip_address, switch_map.models.id 
FROM switch_map.switch_place2, switch_map.sw_warehouse, switch_map.models
WHERE (switch_map.switch_place2.sw_id = switch_map.sw_warehouse.id) AND (switch_map.sw_warehouse.model_id = switch_map.models.id) AND
(switch_map.models.id IN (1,2,3,7,15));";

my $output = $dbh->prepare($query);
$output->execute;
my ($b_ip, $id_mod);
$output->bind_columns(undef, \($b_ip, $id_mod));

while ($output->fetch) {
    push @mas_ip, $b_ip;
    push @mas_id_mod, $id_mod;
}

$dbh->disconnect;

foreach(@users) {
    if ($j<$#mas_ip){
        switch($mas_id_mod[$j]){
                case 1 {$b_oid = "1.3.6.1.4.1.171.11.64.1.2.10.5.1.4";}
                case 2 {$b_oid = "1.3.6.1.4.1.171.11.63.6.2.7.11.1.4";}
                case 3 {$b_oid = "1.3.6.1.4.1.171.11.63.3.2.7.5.1.4";}
                case 7 {$b_oid = "1.3.6.1.4.1.171.11.63.6.2.7.11.1.4";}
                case 15 {$b_oid = "1.3.6.1.4.1.171.12.73.3.1.3.1.2";}
        }
        $b_ip = $mas_ip[$j];
        $globx{$_} = Thread::Queue->new;
        $thread{$_} = threads->create(\&kar, $b_ip, $b_oid);
        $j++;
    }
}


while ($j<$#mas_ip){
    foreach (@users){
        if ($j<$#mas_ip) {
             if ($globx{$_}->pending eq 0) {
                switch($mas_id_mod[$j]){
                    case 1 {$b_oid = "1.3.6.1.4.1.171.11.64.1.2.10.5.1.4";}
                    case 2 {$b_oid = "1.3.6.1.4.1.171.11.63.6.2.7.11.1.4";}
                    case 3 {$b_oid = "1.3.6.1.4.1.171.11.63.3.2.7.5.1.4";}
                    case 7 {$b_oid = "1.3.6.1.4.1.171.11.63.6.2.7.11.1.4";}
                    case 15 {$b_oid = "1.3.6.1.4.1.171.12.73.3.1.3.1.2";}
                }
                $globx{$_}->enqueue($j);
                $j++;
            }
        }
    }
}
=head
my $f=1;
while ($f>0) {
    $f=0;
    foreach(@users) {
        if ($globx{$_}->pending eq 0) {
        } else {
            $f=1;
        }
    }
}
=cut
sleep(2);
foreach(@users) {

    $thread{$_}->detach;
}

sub kar
{
while (my $w = $globx{$_}->dequeue){
if ($w>0) {
======Код функции исполняемой нитями
}

PM MAIL   Вверх
taryk
Дата 17.10.2011, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Guran @  17.10.2011,  10:02 Найти цитируемый пост)
В конце концов получилась такая штука, может кому поможет:


чтобы юзать shared переменные нужно добавить 
Код

use threads::shared;

PM MAIL   Вверх
Guran
Дата 23.10.2011, 05:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нашел несколько косяков в коде. Рабочий вариант:

Код

#!/usr/bin/perl

use threads;
use strict;
use Switch;
use Net::SNMP;
use Thread::Queue;
use threads::shared;
use DBI;

my $b_ip : shared;
my $b_oid : shared;
my @mas_ip : shared;
my @mas_id_mod : shared;
my @mas_id_ip : shared;
my @users=0..29;
my %thread;
my %globx : shared;
my $j : shared = 0;
my @sql : shared;


foreach(@users) {
    if ($j<$#mas_ip){
        $globx{$_} = Thread::Queue->new;
        $thread{$_} = threads->create(\&kar);
        $j++;
    }
}

$j=0;
while ($j<$#mas_ip){
    my $f=0;
    foreach (@users){
        if ($j<$#mas_ip) {
             if ($globx{$_}->pending eq 0) {
                $globx{$_}->enqueue($j);
                $j++;
            }
        }
    }
}

sleep(3);
foreach(@users) {
    if ($globx{$_}->pending eq 0) {
        $globx{$_}->enqueue(-1);
        $thread{$_}->join;
    }
}

sub kar
{
    while (my $w = $globx{$_}->dequeue){
       if ($w<0) { return "ok";
       }else{
#===============Тут нужная вам функция

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


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

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


 




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


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

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