1

DBIx::HA パッケージに 1 秒未満のタイムアウトを実装する必要があります。そのモジュールから次のコードを取得します。

my $timeout = 0;
eval {
    no strict;
    my $h = set_sig_handler(
        'ALRM', 
        sub { $timeout = 1; die 'TIMEOUT'; },
        { mask=>['ALRM'], safe=>1 }
    );
    alarm($DATABASE::conf{_getdbname($dsn)}->{'connecttimeout'});
    $dbh = DBI->connect($dsn, $username, $auth, $attrs);
    alarm(0);
};

Perl のコア モジュール Time::HiRes があることは知っていますが、これまで使用したことがありません。また、alarm()サブもあります -use Time::HiRes qw (alarm);上記の行の前に挿入してもよろしいですか? それとも、上記の行を何らかの形で適応させる必要がありますか? 明らかな例は見つかりませんでした。

4

2 に答える 2

1

OK、まだ小さな問題がいくつかありますが、それらが Time::HiRes に接続されているとは思えません。一般的に、次の解決策は実際に機能します。

use Time::HiRes qw (alarm); # Just adding this line.... ;)
my $timeout = 0;
eval {
    no strict;
    my $h = set_sig_handler(
        'ALRM', 
        sub { $timeout = 1; die 'TIMEOUT'; },
        { mask=>['ALRM'], safe=>1 }
    );
    alarm($DATABASE::conf{_getdbname($dsn)}->{'connecttimeout'});
    $dbh = DBI->connect($dsn, $username, $auth, $attrs);
    alarm(0);
};

知っておくと良いです!:D

于 2015-08-13T06:57:33.007 に答える
1

あなたが言ったように正確に行うことができます。alarmコードを呼び出す前に、Time::HiRes をロードしてインポートするだけです。ただし、コードのすぐ上に配置しないでくださいuse。ステートメントをいたるところに配置することはお勧めできません。トップに属します。

Time::HiRes docには次のように書かれています(強調は私のものです):

アラーム ( $floating_seconds [, $interval_floating_seconds ] )

SIGALRM シグナルは、指定された秒数の後に送信されます。利用可能な場合は setitimer() を使用して実装され、利用できない場合は ualarm() を使用して実装されます。$interval_floating_seconds 引数はオプションであり、指定されていない場合はゼロになり、alarm() のような動作になります。この関数はインポートすることができ、結果として perlで提供されるアラームのドロップイン置換となります。以下の「例」を参照してください。

その後、この例(逐語的に引用) があり、浮動小数点値をalarm今すぐ​​使用できることをうまく示しています。

use Time::HiRes qw ( time alarm sleep );
$now_fractions = time;
sleep (2.5);
alarm (10.6666666);
于 2015-08-13T06:58:18.787 に答える