Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > небольшие траблы с потоками


Автор: reddim 29.1.2012, 23:58
Не могу сообразить как преобразовать многопоточный скрип что бы он работал корректно.
Суть: два текстовых файла logins.txt и pass.txt
Нужно их вывести на экран..что бы они были без повторенией !!! вот так нужно
user=pass1
user=pass2
user=pass3

Код

use threads;
use threads::shared;

my $threads = 5 ;
my @trl = ();

$trl[$_] = threads->create(\&potoki) for 0..$threads - 1;
$_->join for @trl;

sub potoki
{
тут организовать чтение из файлов и вывод 
}


Пробовал вот так...

Код

#!/usr/bin/perl
use threads;
use threads::shared;

my $threads = 3 ;
my @trl = ();



$trl[$_] = threads->create(\&gogo) for 0..$threads - 1;
$_->join for @trl;

my ($password,$sites);
sub gogo
{
open (F,"<sites.txt");
while(my $site=<F>){

chomp($site);

open (N,"<pass.txt");
while(my $pass=<N>){

chomp($pass);

print "$site=$pass\n";

}}}
<>;

Но результат  с повторами, т.е 3 потока = 3 повтора...

user=pass1
user=pass2
user=pass3
user=pass1
user=pass2
user=pass3
user=pass1
user=pass2
user=pass3

Вообщем пробовал и через  foreach и еще по разному, пришел к выводу, что нужно это всё дело сделать что бы было в 1 цикле = while

т.е нужно это в 1 файл как то сделать а потом разбить, и тогда нормально получится...типа 
while(@sites) {
my ($pass, $sites) = split $делитель => shift @sites;
}

просто это так если чесно за*ло 30 раз с этим сталкиваюсь и не могу решить.

Автор: infarch 30.1.2012, 11:08
А что тут странного? Вы одновременно читаете одни и те же файлы в нескольких потоках. Вот и получаете одни и те же строки в выводе. Если дело просто в чтении файла, при чем тут потоки? Сделайте простой цикл. Если же предстоят некие операции связанные с веб, тогда да, потоки не помешают. Но не так как вы сделали. Сначала в главном потоке надо вычитать файлы и создать очередь задач. Потом создать потоки исполнители и расшарить между ними эту очередь. Почитайте про Thread::Queue.

Автор: reddim 30.1.2012, 11:32
я вам не гуру потоков) я вообще ничего не понял что вы написали, почитаю..мб есть какие-то примеры..а через данную конструкцию как реализовать

use threads;
use threads::shared;
my $threads = 5 ;
my @trl = ();
$trl[$_] = threads->create(\&potoki) for 0..$threads - 1;
$_->join for @trl;
sub potoki
{
чтение из файлов и вывод 
}

Автор: DurRandir 30.1.2012, 12:06
Какую именно операцию вы хотите распараллелить? Как только вы ответите для себя на этот вопрос - то сможете это описать. А то пока у меня такое чувство, что потоки для вас - магия, которая "сделает всё сама".

Автор: tzirechnoy 30.1.2012, 13:06
Берёте какую-нибудь книжку по программированию для начинающих (лучшэ -- Кнут Д., Искусство программирования), и начинаете решать примеры. Последовательно. Когда прорешаете примеры нормальной сложности -- возвращайтесь, будет о чём разговаривать.

(Потому, что всё, что Вы написали -- это просто ад. А Вашэ написание методом генетического программирования -- в особенности).

PS И да, Ш-шпанчик Вас упаси связываться с потоками. Это вообще чрезвычайно переоцэнённая, а потому достаточно вредная модэль вычислений. В общем, не трогайте.

Автор: reddim 30.1.2012, 13:23
я прошу лишь показать мне многопоточный пример вывода данных из 2 разных файлов...и всё..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)