我正在使用IO::Select来跟踪读取的变量数量的文件句柄。我遇到的文档强烈建议不要将select语句与<>(readline)结合使用来读取文件句柄。
我的情况是:
我每个文件句柄只会使用一次,即当select提供给我文件句柄时,它将被完全使用,然后从select中删除。我将接收一个哈希和可变数量的文件。如果这需要阻塞一段时间,我也不介意。
为了更好地理解,我是一个客户端,发送要由服务器处理的信息。每个文件句柄都是我与不同服务器通信的句柄。一旦服务器完成,每个服务器都会向我发送一个哈希结果。哈希中包含一个数字,表示要跟随的文件数。
我希望使用readline来与现有项目代码集成,以传输Perl对象和文件。
示例代码:
我的情况是:
我每个文件句柄只会使用一次,即当select提供给我文件句柄时,它将被完全使用,然后从select中删除。我将接收一个哈希和可变数量的文件。如果这需要阻塞一段时间,我也不介意。
为了更好地理解,我是一个客户端,发送要由服务器处理的信息。每个文件句柄都是我与不同服务器通信的句柄。一旦服务器完成,每个服务器都会向我发送一个哈希结果。哈希中包含一个数字,表示要跟随的文件数。
我希望使用readline来与现有项目代码集成,以传输Perl对象和文件。
示例代码:
my $read_set = IO::Select()->new;
my $count = @agents_to_run; #array comes as an argument
for $agent ( @agents_to_run ) {
( $sock, my $peerhost, my $peerport )
= server($config_settings{ $agent }->
{ 'Host' },$config_settings{ $agent }->{ 'Port' };
$read_set->add( $sock );
}
while ( $count > 0) {
my @rh_set = IO::Select->can_read();
for my $rh ( @{ $rh_set } ) {
my %results = <$rh>;
my $num_files = $results{'numFiles'};
my @files = ();
for (my i; i < $num_files; i++) {
$files[i]=<$rh>;
}
#process results, close fh, decrement count, etc
}
}
{ my $oldfh = select $rh; $| = 1; select $oldfh; }
对于读取句柄是无用的。这是一件好事,因为如果 Perl 按照您所希望的在每次读取后清空缓冲区,您将会丢失数据! - ikegami