我有一些问题,如何更系统地输出
答案 0 :(得分:1)
好的,所以你在这里遇到了一个问题 - 你在一个工人中做了print
,那是在async
区内。
线程的整点和async
表示执行顺序未定义,因此您根本无法获得预期和期望的结果。
如果您希望对数据进行排序,则需要对数据进行整理和后处理。
因此,定义一个输出队列,将结果排入队列,并在结束线程后对它们进行整理。
这样的事情:
#!/usr/bin/perl
use warnings qw( all );
use threads;
use Thread::Queue qw( );
my $output_q = Thread::Queue -> new;
use constant NUM_WORKERS => 10;
sub worker {
my ($core) = @_;
@data1 = qw(john amount );
@data2 = qw(test1 test2 );
foreach $loop1 (@data1) {
foreach $loop2 (@data2) {
#print("$core $loop1 $loop2\n");
$output_q -> enqueue ( "$core $loop1 $loop2" );
}
}
}
{
my $core_data = "data.txt";
open( my $core_dat, '<', $core_data )
or die("Can't open \"$core_data\": $!\n");
my $q = Thread::Queue->new();
for ( 1 .. NUM_WORKERS ) {
async {
while ( defined( my $core = $q->dequeue() ) ) {
worker($core);
}
};
}
while ( my $file = <$core_dat> ) {
chomp($file);
$q->enqueue($file);
}
$q->end();
$_->join() for threads->list();
$output_q -> end;
#dequeue everything from $output_q and then sort it.
print join "\n", sort $output_q->dequeue_nb($output_q -> pending);
}
注意 - 这将为每个结果传回一个字符串,然后对其进行排序。那个可能不完全是你想要的(虽然它会根据你到目前为止的工作而工作)。
你可以举例如:
$output_q -> enqueue ( [ $core, $loop1, $loop2 ]);
然后将每个$output_q
项视为数组引用,并根据该项进行排序。如果这是你想要走下去的道路,我会建议最好把它作为另一个问题。