ストリーミング イテレータ

通話中 GoogleAdsService.search_stream ストリーミング レスポンスのイテレータが返されます。このイテレータは GoogleAdsService クライアントと同じスコープを使用しますが、 ストリームやセグメンテーション障害などが 原因になりますこれは、gRPC Channel オブジェクトが 開いている GoogleAdsService オブジェクトがスコープ外になると、ガベージ コレクションが行われます。 反復処理の時点で GoogleAdsService オブジェクトがスコープ内になくなった場合 search_stream の結果で発生するため、Channel オブジェクトはすでに 破棄されるため、イテレータが新しいオブジェクトを取得しようとすると、未定義の動作が発生します。 指定します。

次のコードは、ストリーミング イテレータの誤った使用法を示しています。

def stream_response(client, customer_id, query):
    return client.get_service("GoogleAdsService", version="v17").search_stream(customer_id, query=query)

def main(client, customer_id):
    query = "SELECT campaign.name FROM campaign LIMIT 10"
    response = stream_response(client, customer_id, query=query)
    # Access the iterator in a different scope from where the service object was created.
    try:
        for batch in response:
            # Iterate through response, expect undefined behavior.

上記のコードでは、GoogleAdsService オブジェクトが異なるディレクトリ内に作成されています。 アクセス元のスコープを指定します。その結果、Channel オブジェクトは イテレータがレスポンス全体を使用する前に破棄されます。

代わりに、ストリーミング イテレータのスコープは、 GoogleAdsService クライアントは、使用中である限り有効です。

def main(client, customer_id):
    ga_service = client.get_service("GoogleAdsService", version="v17")
    query = "SELECT campaign.name FROM campaign LIMIT 10"
    response = ga_service.search_stream(customer_id=customer_id, query=query)
    # Access the iterator in the same scope as where the service object was created.
    try:
        for batch in response:
            # Successfully iterate through response.