Я написал следующий короткий скрипт, и я продолжаю получать ошибки:Hash Tables ниток в Perl
Invalid value for shared scalar at E:\Scripts\Threads.pl line 19.
Я не знаю, почему, так как я с помощью общих значений в общем массиве.
use strict;
use threads;
use threads::shared;
my $totalInstances = 0;
my $totalDest = 0;
my $totalResults = 0;
my @threads = threads->self();
my @resultsHash : shared =();
my $dest : shared =();
my $hostname : shared =();
my @destinations : shared =();
my @hostnames : shared =();
@destinations={"London","NYC"};
@hostnames={"wev1010","web1111"};
foreach $dest (@destinations) {
foreach $hostname (@hostnames) {
push @threads, threads->new(\&ParsingResponse,$hostname,$dest);
}
sleep(6);
}
foreach (@threads) {
my $retval = eval ($_->join());
if ([email protected]) {
print ERRFILE "Thread failed: [email protected]";
}
}
###########################################
# Parsing response
#
###########################################
sub ParsingResponse
{
push @resultsHash, {
dest => "$dest",
hostname => "$hostname",
}
}
Line 19 в моем коде: @destinations = { "Лондон", "NYC"};
Обновленный сценарий:
use strict;
use threads;
use threads::shared;
our @threads = threads->self();
our %resultsHash : shared =();
our $dest : shared =();
our $hostname : shared =();
our @destinations : shared =();
our @hostnames : shared =();
@destinations[0]="London";
@destinations[1]="Paris";
@hostnames[0]="wev1010";
@hostnames[1]="web1111";
sub ParsingResponse
{
$resultsHash{$dest}= "$hostname";
}
foreach $dest (@destinations) {
foreach $hostname (@hostnames) {
push @threads, threads->new(\&ParsingResponse,$hostname,$dest);
}
}
foreach (@threads) {
my $retval = eval ($_->join());
if ([email protected]) {
print "Thread failed: [email protected]";
}
}
Какая из них - строка 19? В вашем фрагменте строка 19 - пустая строка. –
@ destinations = {"Лондон", "Нью-Йорк Сити"}; –
Вы пытаетесь использовать многопоточность для некоторых проблем, но это, вероятно, неправильное решение. Вы, кажется, не знаете много Perl, например. массивы инициализируются как '@array = (" foo "," bar ")' - не завитки! Это 'eval ($ _-> join())' не будет делать то, что вы хотите! Избегайте общих данных, если это возможно, и перечитайте [поток :: shared docs] (http://p3rl.org/threads::shared). Для связи между потоками вы должны использовать ['Thread :: Queue'] (http://p3rl.org/Thread::Queue). – amon