2012-02-24 11 views
1

Iは画像の可変数で満たされたページをレンダリングするために神社を使用しているGAEデータストアから複数の画像を配信迅速フォーマットを使用して、

<img src="/image?id=x" /> 

から関連画像を検索するハンドラへの画像URL点http://code.google.com/appengine/articles/python/serving_dynamic_images.html

私が抱えている問題は、ロードされている各イメージの間にわずかな遅延があり、それぞれが順番にロードされていることです。つまり、イメージが50個あるページそれをロードするには許容できないほどの時間がかかります。

これを回避する方法を知っている人はいますか?どうやら、複数のスレッドでイメージサービスハンドラを実行するようにサーバを設定する必要があるように感じます。

+1

これはデベロッパーサーバー、またはプロダクションにありますか? – geoffspear

+0

良い点、これはdevサーバにあります – Cerzi

+6

devサーバはシングルスレッドであり、一度に複数のファイルを提供することはできません。これは予想される動作です。 (スターhttp://code.google.com/p/googleappengine/issues/detail?id=343) – geoffspear

答えて

1

dev_appserver.pyサーバはシングルスレッドであると指摘されています。プロダクションサーバーは、いつでもブラウザの限界まで快適に複数の画像を提供することができます。

さらにアドバイスがあります:/image_xxx.jpgや/images/xxx.jpgなどのURLを使用して有効期限ヘッダーを送信する必要があります。それはイメージの繰り返しのダウンロードを防ぎます。また、キャッシュをバックエンドに向けると、App Engineやアプリケーションからではなく、そこからキャッシュされたバージョンの画像を配信するのが簡単になります。

これらのアイデアは、あなたを非常に遠ざけるものです。この制限に達すると、CDNサービスを雇ってキャッシュ可能な画像の前に置くことができます。

1

これはおそらくAppEngineの制限ではありません。 AppEngineは自動的に要求に対応します。ただし、ブラウザは同じホスト名に対する特定の数の同時リクエストに限定されています。これはブラウザによって異なりますが、いくつかはユーザの設定を許可しますが、最近のブラウザでは制限は6です。詳しくはthis chartを参照してください。

ここでは、ドメインごとではなく、ホスト名に制限が設定されています。したがって、実際には、FOO-dot-APPNAMEの構文を使用して、AppEngineが任意のサブドメインであなたのアプリケーションを提供するという事実を利用することができます。たとえば、アプリがmyblogの場合は、img1-dot-myblog.appspot.com,img2-dot-myblog.appspot.comなどにサービスを提供することができ、これらはブラウザの観点からは同時接続としてカウントされません。

0

@ダニエル・ローズマンの答えを最初に読んでください。彼は制限がブラウザ側にあることに注意するのが正しい。最新のデスクトップブラウザでは、パラレルリクエストはドメインごとに6個、合計で35-40個に制限されています。これを回避するには

  1. は、複数のホスト名へのあなたのイメージのリクエストをファンアウトしてください。異なるバージョンにアップロードすることで、GAEで簡単に行うことができます(例: img1.yourapp.appspot.comimg2.yourapp.appspot.comなど。ランダムな範囲番号をimgに追加することによって、バージョンプレフィックスを生成することができます。

  2. イメージのある固定されたスーパーセットがある場合は、1つのイメージでそれらを組み合わせて、特定のイメージをimage sprites経由で参照するよりも、このようにすれば、1回のリクエストで1つの大きな画像のみをダウンロードできます。 App Engineで画像を結合するには、複合体ImagesServiceFactory.makeComposite(image, ...)を作成し、複合体をImagesService.composite(composites, ...)という1つの画像に結合します。

0

プロダクションでの使用を検討する必要があります。これらのURLをプリセットすると、画像を扱う必要がなくなり、読み込み速度が大幅に向上します。

イメージが作成されると、serve_urlを作成してエンティティで設定して、ハンドラにアクセスせずにURLを直接テンプレートに入れることができます。

これは、sdkを使用してローカルマシン上の何も変更しません。

0

あなたが参照している記事は非常に古いです。 get_serving_url(blob_key、size = None、crop = False) あなたのアプリケーションと高速のために、のno loadで画像がGoogleによって提供されます。

私は、Jinja関数ローダーを使用して配信URLを生成します。あなたのアイデアを与えるには: このテンプレートライン:

<img alt="front=698.jpg" src="http://lh3.ggpht.com/-obCxGmlnWZFU-UGRTA6juHNpNPJ90-XafQsYdCW_53ANDlzA4l33n-DBvevcI4urHu9Qa205ZOx5YBg3IU=s698" /> 

のことができます。でも、サイズ、実行時に画像を:

<img {% include "front=698.jpg" %} /> 

はのようなものに変換されます。ところで、あなたのアプリケーションをあなたのアプリケーションブロブストアにアップロードする必要があります。しかし、提供はによって行われます:Google。 NO LOAD

関連する問題