DBD::Pg でリクエスト並列化

PerlからPostgreSQLに非同期アクセスする方法 - iakioの日記 - postgresqlグループ を見てほぉぉと思って、IRC で話したりしながら適当に書いてみた。たぶんこんな感じ。動かしてないけど。

use DBD::Pg qw(:async);

# send queries
for my $dbh (@dbh_list) {
  $dbh->execute(...);
}
# and wait until all responses arrive
my %pending = map {
  +($_->{pg_socket}, [ IO::Handle->new_from_fd($_->{pg_socket}), $_ ])
} @dbh_list;
my $sel = IO::Select->new();
$sel->add($_->[0], 'r') for values %pending;
while (%pending) {
  for my $h ($sel->can_read(1)) {
    if ($pending{$h->{pg_socket}}->[1]->pg_ready) {
      $sel->remove($pending{$h->{pg_socket}}->[0];
      delete $pending{$h->{pg_socket}};
    }
  }
}