2

インターネットから多くの小さな情報をダウンロードするプログラムを既に gawk で作成しています。(メディアスキャナーとインデクサー)

現在、wget を起動して情報を取得しています。これで問題ありませんが、呼び出し間の接続を単純に再利用したいと思います。プログラムを実行すると、同じ API サービスに対して 200 ~ 2000 回の呼び出しが行われる可能性があります。

gawk がネットワーキングを実行できることを発見したところ、geturlを見つけまし た。ただし、そのページの下部にあるアドバイスは十分に考慮されていますが、最後の行を読んで接続を開いたままにする簡単な方法を見つけることができません。

私は主に JSON データを読んでいるので、RS="}" を設定して、本文の長さが予想されるコンテンツの長さに達したときに終了できます。ただし、これは末尾の空白で壊れる可能性があります。より強固なアプローチを希望します。接続を開いたままにする散発的な http リクエストを awk に実装するより良い方法はありますか。現在、私は次の構造を持っています...

con="/inet/tcp/0/host/80";

send_http_request(con);

RS="\r\n";

read_headers();

# now read the body - but do not close the connection...
RS="}"; # for JSON
while ( con |& getline bytes ) {
    body = body bytes RS;
    if (length(body) >= content_length) break;
    print length(body);
}
# Do not close con here - keep open

この小さなことがここでのすべての可能性を台無しにしているように見えるのは残念です. また、誰かが尋ねる場合:) ..

  • awk が最初に選択されたのは歴史的な理由からです。当時、この組み込みプラットフォームには他の言語オプションがあまりありませんでした。
  • 事前にすべての URL を収集して wget に渡すのは簡単ではありません。
  • perl/python などで再実装することは、簡単な解決策ではありません。
  • URLを名前付きパイプと wget -i - にパイプしようとしているのを見てきましたが、うまくいきません。データはバッファリングされ、アンバッファは使用できません。また、wget は処理前に EOF まですべての URL を収集すると思います。
  • データは小さいので、圧縮が不足していても問題ありません。
4

1 に答える 1

2

接続の再利用に関する問題は、gawk ではなく、HTTP 1.0 標準に起因します。接続を再利用するには、HTTP 1.1 を使用するか、HTTP 1.0 の他の非標準ソリューションを試す必要があります。Host:必須であるため、HTTP/1.1 リクエストにヘッダーを追加することを忘れないでください。

応答本文を読むときの堅牢性の欠如については正しいです。回線指向のプロトコルの場合、これは問題ではありません。さらに、HTTP 1.1 を使用している場合でも、スクリプトがロックしてはならないときに追加のデータを待ってロックすると、サーバーは再び非アクティブのために接続を閉じます。

最後の手段として、任意の言語で独自の HTTP リトリーバーを作成して、接続を再利用し (すべて同じリモート ホストと思われます)、特別なレコード セパレーターを挿入することもできます。次に、 awk script から制御できます。

于 2012-04-06T00:25:44.627 に答える