Я пытаюсь получить текст из двух больших файлов. Чтобы ускорить это, я попробовал потоки. Прежде чем я использовал потоки, скрипт работал, а теперь нет.Perl: записать значение в потоке
Проблема в следующем: я сохраняю все, что я прочитал в файле, в хэш. Когда я распечатываю размер (или клавиши/значения) после чтения в суб (который выполняется нить), он показывает правильное число> 0, когда я печатаю размер хэша в другом месте (после потоков пробег), это показывает мне 0.
print ": ".keys(%c);
используется 2 раза, и каждый раз имеет разную мощность. (В финальной программе 2 потоков выполняются и способ, чтобы сравнить материал вызывается после нити законченный)
Пример кода:
my %c;
my @threads = initThreads();
@threads[0] = threads->create(\&ce);
foreach(@threads){
$_->join();
}
print ": ".keys(%c);
sub initThreads{
my @initThreads;
for(my $i = 0; $i<2;$i++){
push(@initThreads, $i);
}
return @initThreads;
}
sub ce(){
my $id = threads->tid();
open my $file, "<", @arg1[1] or die $!;
my @cXY;
my @cDa;
while(my $line = <$file>){
# some regex and push to arrays, works
@c{@cXY} = @cDa;
}
print "Thread $id is done\n";
close $file;
print ": ".keys(%c);
threads->exit();
}
Должен ли я запускать вещи после первых 2-х нитей закончен в другом потоке, который ждет, пока первые два не закончатся? Или что я делаю неправильно с потоками?
Спасибо.
Спасибо, это сработало. К сожалению, это не быстрее, чем чтение в файлах один за другим, это даже намного медленнее ... – user1203092
Быстрее ли это в несетевой версии с несколькими версиями (даже если это неверно)? Обмен данными имеет свои затраты. Хеш заблокирован каждый раз, когда он доступен; вы фактически блокируете другие потоки, когда это происходит. Возможно, вы захотите попробовать подход в другом ответе, который предлагает вернуть данные из потока. Это полностью изолирует потоки. –