google.appengine.ext.remote_api.throttle モジュール

概要

remote_api_stub で使用するためのクライアント側転送スロットリング。

このモジュールは、remote_api を介して AppEngine サービスにアクセスするプログラムのレート制限を設定するのに使用されます。

詳細については、Throttle クラスをご覧ください。

スロットリングの例: — from google.appengine.ext import db from google.appengine.ext.remote_api import remote_api_stub from google.appengine.ext.remote_api import throttle from myapp import models import getpass import threading

def auth_func():

return (raw_input(‘Username:’), getpass.getpass(‘Password:’))

remote_api_stub.ConfigureRemoteDatastore(‘my-app’, ‘/remote_api’, auth_func) full_throttle = throttle.DefaultThrottle(multiplier=1.0) throttle.ThrottleRemoteDatastore(full_throttle)

# データストアを使用するスレッドを throttler full_throttle.Register(threading.currentThread()) で登録します

# コードが App Engine で実行されているかのようにリモート データストアにアクセスできるようになりました。割り当て上限を超過する心配する必要はありません。

houses = models.House.all().fetch(100) for a_house in houses:

a_house.doors += 1

db.put(houses) —

この例では、使用量をデフォルトの空き割り当て上限に制限しています。throttle.DefaultThrottle に 乗数 kwarg を使用して、スロットルレベルを増減できます。

さまざまなオペレーションの制限をより細かく制御するために、スロットルを直接構築することもできます。詳細については、Throttle クラスとそれに続く定数をご覧ください。

目次

class google.appengine.ext.remote_api.throttle.DatastoreThrottler(throttle)ソース

ベース: google.appengine.ext.remote_api.throttle.Throttler

AddCost(cost_proto)ソース

Cost protobuf からコストを追加します。

google.appengine.ext.remote_api.throttle.DefaultThrottle(multiplier=1.0)ソース

「乗数 * 割り当て上限」を持つ Throttle インスタンスを返します。

exception google.appengine.ext.remote_api.throttle.Errorソース

ベース: exceptions.Exception

このモジュールのエラーの基本クラスです。

google.appengine.ext.remote_api.throttle.InterruptibleSleep(sleep_time)ソース

このスレッドの exit_flag を 1 秒に 4 回チェックして、スレッドをスリープ状態にします。

パラメータ

sleep_time - スリープ状態になるまでの時間。

google.appengine.ext.remote_api.throttle.SleepHandler(*throttle_names)ソース
exception google.appengine.ext.remote_api.throttle.ThreadNotRegisteredErrorソース

ベース: google.appengine.ext.remote_api.throttle.Error

登録されていないスレッドが、スロットルされたデータストア スタブにアクセスしました。

class google.appengine.ext.remote_api.throttle.Throttle(get_time=function, thread_sleep=InterruptibleSleep, layout=None)ソース

ベース: オブジェクト

アップロード速度スロットリングの基本クラス。

多数のエンティティを極端に早く転送すると、割り当て上限が発生し、転送プロセスが停止する可能性があります。アプリケーションの割り当て上限内に留まるために、(転送スレッド全体で)指定された制限にデータ転送を絞り込みます。

このクラスは、転送速度の一部の移動平均(帯域幅、1 秒あたりのレコード数、1 秒あたりの HTTP 接続数)をトラッキングします。スレッドごとに、転送されたバイト数の 2 つの期間が保持されます。ブロックの 1 つは「現在の」ブロックであり、もう 1 つは「前の」ブロックです。ROTATE_PERIOD が経過すると、カウントは現在の値から前の値にローテーションします。したがって、現在のブロックは 0 秒から ROTATE_PERIOD 秒までのアクティビティを表します(time.time() - self.last_rotate によって決まります)。前のブロックは常に完全な ROTATE_PERIOD を表します。

スリープは別のブロックの転送の直前に実行され、次の転送の前に転送されたカウントに基づいています。どの程度のデータ量が転送されるかは重要ではありませんが、それまでに転送されたすべてのデータに対して、集約転送レートが指定された制限内に収まるように十分な休止が散在していることが重要です。

これらのカウントはスレッドごとに維持されるため、カウントをインクリメントするためのインターロックは必要ありません。カウントのローテーションにはインターロックがあります。複数のスレッドにより、カウントに対して逓倍化されたローテーションが行われないようにするためです。

こうしたカウントの計算および収集には、さまざまな競合条件があります。正確な値は必要ありませんが、転送全体を帯域幅の制限内に収める必要があります。指定の休止時間が多少短い、または多少長い場合、集約遅延は正確になります。

AddThrottle(name, limit)ソース
AddThrottles(layout)ソース
AddTransfer(throttle_name, token_count)ソース

このスレッドが転送した量にカウントを追加します。

スレッドがデータを転送するたびに、このメソッドを呼び出して送信された量を記録する必要があります。最後のローテーションから十分な時間が経過すると、カウントがローテーションすることがあります。

パラメータ
  • throttle_name - 追加するスロットルの名前。

  • token_count - スロットル カウンタに追加する数。

ROTATE_PERIOD = 600
Register(thread)ソース

このスレッドを throttler に登録してください。

Sleep(throttle_name=None)ソース

転送レートを制限するためにスリープ状態になる可能性があります。

転送しようとしているものではなく、以前の転送に基づいてスリープ状態になることに注意してください。次回の転送では、制限を下回る状態か上回る状態になる可能性があり、そのような状態は次回の転送の後に修正されます。最終的に、平均転送レートは範囲内にとどまるようになります。スレッド間でレートが急上昇 / 急下降したり、不均一になったりすることにより、転送レートが短時間で要求された制限を超える可能性があります。

パラメータ

throttle_name - スリープするスロットルの名前。None または省略された場合、すべてのスロットルでスリープします。

TotalTransferred(throttle_name)ソース

合計転送量と転送に要した期間を返します。

パラメータ

throttle_name - 合計するスロットルの名前。

戻り値

指定されたスロットル名の合計カウントと実行時間のタプル。

VerifyThrottleName(throttle_name)ソース
class google.appengine.ext.remote_api.throttle.ThrottleHandler(throttle)ソース

ベース: urllib2.BaseHandler

スロットルに追加する http および https リクエストの urllib2 ハンドラ。

AddRequest(throttle_name, req)ソース

指定されたリクエストに対して帯域幅スロットルに追加します。

パラメータ
  • throttle_name - 追加する帯域幅スロットルの名前。

  • req - サイズがスロットルに追加されるリクエスト。

AddResponse(throttle_name, res)ソース

指定されたレスポンスに対して帯域幅スロットルに追加します。

パラメータ
  • throttle_name - 追加する帯域幅スロットルの名前。

  • req - サイズがスロットルに追加されるレスポンス。

http_request(req)ソース

HTTP リクエストを処理します。

スロットルが割り当て上限を超えている場合、まずスリープ状態になります。次に、送信するリクエストを返す前にスロットルにリクエスト サイズを追加します。

パラメータ

req – urllib2.Request オブジェクト。

戻り値

渡されたリクエスト。

http_response(unused_req, res)ソース

HTTP レスポンスを処理します。

レスポンスのサイズは帯域幅スロットルに加えられ、リクエスト スロットルは 1 ずつ増えます。

パラメータ
  • unused_req – このレスポンスの urllib2 リクエスト。

  • res – urllib2 レスポンス オブジェクト。

戻り値

渡されたレスポンス。

https_request(req)ソース

HTTPS リクエストを処理します。

スロットルが割り当て上限を超えている場合、まずスリープ状態になります。次に、送信するリクエストを返す前にスロットルにリクエスト サイズを追加します。

パラメータ

req – urllib2.Request オブジェクト。

戻り値

渡されたリクエスト。

https_response(unused_req, res)ソース

HTTPS レスポンスを処理します。

レスポンスのサイズは帯域幅スロットルに加えられ、リクエスト スロットルは 1 ずつ増えます。

パラメータ
  • unused_req – このレスポンスの urllib2 リクエスト。

  • res – urllib2 レスポンス オブジェクト。

戻り値

渡されたレスポンス。

google.appengine.ext.remote_api.throttle.ThrottleRemoteDatastore(throttle, remote_datastore_stub=None)ソース

リモート データストア スタブ用に指定されたスロットルをインストールします。

パラメータ
  • throttle - データストアのアクセスレートを制限する Throttle インスタンス

  • remote_datastore_stub - テスト目的のスロットルへのデータストア スタブ インスタンス。

class google.appengine.ext.remote_api.throttle.ThrottledHttpRpcServer(throttle, *args, **kwargs)ソース

ベース: google.appengine.tools.appengine_rpc.HttpRpcServer

HTTP リクエストに対して単純化された RPC スタイルのインターフェースを提供します。

この RPC サーバーでは、Throttle を使用して、割り当て上限を超過しないようにしています。

class google.appengine.ext.remote_api.throttle.ThrottledHttpRpcServerFactory(throttle, throttle_class=None)ソース

ベース: オブジェクト

指定されたスロットルの ThrottledHttpRpcServer を生成するファクトリ。

class google.appengine.ext.remote_api.throttle.ThrottledHttpRpcServerOAuth2(throttle, *args, **kwargs)ソース

ベース: google.appengine.tools.appengine_rpc_httplib2.HttpRpcServerOAuth2

class google.appengine.ext.remote_api.throttle.Throttlerソース

ベース: オブジェクト

PosthookHandler(service, call, request, response)ソース
PrehookHandler(service, call, request, response)ソース
exception google.appengine.ext.remote_api.throttle.UnknownThrottleNameErrorソース

ベース: google.appengine.ext.remote_api.throttle.Error

不明なスロットル名に対し転送が追加されました。