我已经创建了一个包含两个线程的Perl脚本:
1)创建.cfg文件
2)读取这些.cfg文件
我希望在一个线程忙于制作文件的同时,让我的第二个线程同时读取这些文件。
但是我正面临着一个问题,当我的第二个线程被创建时,它将只读取在那个时刻创建的文件。有人能给出完成这项任务的想法吗?
创建线程和读取文件功能如下:
sub CreateThreads() {
$threads[0] = threads->create( \&CreateCFG );
sleep 3;
$threads[1] = threads->create( \&ReadCFG );
}
sub ReadCFG() {
my $id = threads->tid();
opendir( DIR, $filedir ) or die $!;
while ( my $files = readdir(DIR) ) {
if ( $files eq "." || $files eq ".." ) {
next;
}
else {
my $filepath = $filedir . "/" . $files;
if ( $files =~ m/$probename/ ) {
my @file = split( "&", $files );
if ( $file[3] !~~ @reportrobots ) {
push( @reportrobots, $file[3] );
my $raddr =
"/" . $file[1] . "/" . $file[2] . "/" . $file[3];
&ProbeReport( \$userdata_file, \$filepath, \$raddr );
}
}
}
}
}发布于 2015-07-09 20:39:04
我认为您在这里的问题将是您没有重新读取目录。
opendir( DIR, $filedir ) or die $!;
while ( my $files = readdir(DIR) ) {因为这并不明显,所以实际发生的情况是,您第一次调用readdir时,它会读取目录,而随后的调用只是迭代该列表。
这是为了防止发生奇怪的事情,例如,我在循环中的那个目录中创建了一个文件。
因此,实际上,你的第二个线程只会查看该目录一次。它的功能类似于:
my @files = readdir(DIR);
foreach my $file ( @files ) {我建议您需要的是rewinddir函数。或者可能使用Thread::Queue或其他机制来传递需要处理的文件。
https://stackoverflow.com/questions/31132364
复制相似问题