DBDの非同期:: Pg

私たちは皆、次のスタイルでベースを操作することに慣れています。
  1. リクエストを満たす
  2. 答えを待つ
  3. 実行を続ける


しかし、長いリクエストが機能している間、アプリケーションで何か役に立つことができます。 CPU時間はアイドル状態にしないでください。

PostgreSQLの場合、DBD :: Pgには非同期性があります。 そして時々それは私たちを助けます。

要求が完了するのを待たずに、アプリケーションの実行を継続できます。 これは準備要求のpg_asyncパラメータに含まれています。

use strict;
use warnings;
use Time::HiRes 'sleep';
use DBD::Pg ':async';

my $dbh = DBI->connect('dbi:Pg:dbname=postgres', 'postgres', '', {AutoCommit=>0,RaiseError=>1});

##
my $sth = $dbh->prepare("SELECT pg_sleep(?)", {pg_async => PG_ASYNC});
$sth->execute(5);

## , -
print "Your query is processing. Thanks for waiting\n";
check_on_the_kids();

while (!$dbh->pg_ready) {
check_on_the_kids();
## -
sleep 0.1;
}

print "The query has finished. Gathering results\n";
my $result = $sth->pg_result;
print "Result: $result\n";
my $info = $sth->fetchall_arrayref();


pg_asyncには3つの定数があります。


また、3つのヘルパーメソッドがあります-
マイナスの点-リクエストの実行時にコールバックを設定することはできません。 常に確認する必要があります。
また、1つの接続で一度に実行できる要求は1つだけです。 しかし、何十もの接続を開いてそれらに順番にリクエストを送信することを妨げるものは何ですか?)

このテクノロジーのアプリケーションについてお話します。

Source: https://habr.com/ru/post/J67390/


All Articles