perl - IO::Select 并为句柄添加标签

标签 perl select filehandle

我想知道当我使用 IO::Select 时向句柄添加额外数据的最佳方式是什么?

基本上,我想向 IO::Select 添加一个句柄,但也有附加信息附加到该句柄,我可以稍后检索。

注意:我知道我可以保留一个单独的数据结构来保存句柄和附加数据,但这需要协调两个数据结构,这可能会导致比其值(value)更多的问题。

最佳答案

直接的方法来自IO::Select add 方法的文档

Each handle can be an IO::Handle object, an integer or an array reference where the first element is an IO::Handle or an integer.

所以,这里有一个可以使用的“数组引用”。

一个例子:

use warnings;
use strict;
use feature 'say';

use Time::HiRes qw(sleep);
use POSIX qw(:sys_wait);
use IO::Select;

my $sel = IO::Select->new;

my @procs;
for my $job (1..3) {
    pipe my ($reader, $writer);
    $sel->add( [$reader, "job-$job"] );  # add a tag to the handle

    my $pid = fork // die "Can't fork: $!";

    if ($pid == 0) {
        close $reader;
        sleep rand 4;
        say $writer "\tkid $$ (job $job)";
        close $writer;
        exit; 
    }   
    close $writer;
    push @procs, $pid;
}       
say "Started processes @procs\n";

# Read from pipes when ready, print piped messages
while ( my @ready = $sel->can_read ) {
    foreach my $p (@ready) {
        my ($handle, $tag) = @$p;
        say "Reading from fileno ", $handle->fileno, ", tag: ", $tag;
        print while <$handle>;
        $sel->remove($p);      # *this* order: remove then close
        close $handle;
    }   
}   

# Reap
my $msg = "\nExited (with status): ";
my $kid = 0; # poll to reap
while (($kid = waitpid -1, WNOHANG) > -1) {
    $msg .= "$kid ($?) " if $kid > 0; 
    sleep 0.1;
}   
say $msg;

打印

Started processes 15679 15680 15681

Reading from fileno 5, tag: job-2
        kid 15680 (job 2)
Reading from fileno 4, tag: job-1
        kid 15679 (job 1)
Reading from fileno 6, tag: job-3
        kid 15681 (job 3)

Exited (with status): 15680 (0) 15679 (0) 15681 (0)

关于perl - IO::Select 并为句柄添加标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61094870/

相关文章:

perl - 如何以编程方式生成多个 Perl 文件句柄?

perl - DBIx::Class 中的子查询

perl - Perl 方法属性如何工作?

php - 从日期时间列获取数据

SQL 关键字搜索的首选方式

mysql - GROUP BY 时间戳每 15 分钟一次,包括丢失的条目

perl - 本地在标准流/裸字文件句柄 : STDIN? 上做什么

perl - 在 Perl 中,我如何处理多行

regex - 在 Perl 中的条件之后计算正则表达式中的字符串

python - 关闭 ipython 中所有打开的文件