0

ここでは、コースに学生を追加するスクリプト(Google Classroom API)を作成しました。Pythonでは、バッチ処理されたHTTP要求に対してリクエストごとに '指数バックオフ'を使用できますか?

students = getStudents('Year10', '10A') # VAR 

for student in students: 
    newStudent = { 
     # Student Identifier 
     'userId': student 
    } 
    batch1_1.add(service.courses().students().create(courseId=arCourseId, body=newStudent)) 
    batch1_1.add(service.courses().students().create(courseId=ciCourseId, body=newStudent)) 
    batch1_1.add(service.courses().students().create(courseId=dtCourseId, body=newStudent)) 
    batch1_1.add(service.courses().students().create(courseId=drCourseId, body=newStudent)) 
    batch1_1.add(service.courses().students().create(courseId=enCourseId, body=newStudent)) 
    batch1_2.add(service.courses().students().create(courseId=geCourseId, body=newStudent)) 
    batch1_2.add(service.courses().students().create(courseId=hiCourseId, body=newStudent)) 
    batch1_2.add(service.courses().students().create(courseId=icCourseId, body=newStudent)) 
    batch1_2.add(service.courses().students().create(courseId=laCourseId, body=newStudent)) 
    batch1_2.add(service.courses().students().create(courseId=maCourseId, body=newStudent)) 
    batch1_3.add(service.courses().students().create(courseId=muCourseId, body=newStudent)) 
    batch1_3.add(service.courses().students().create(courseId=peCourseId, body=newStudent)) 
    batch1_3.add(service.courses().students().create(courseId=reCourseId, body=newStudent)) 
    batch1_3.add(service.courses().students().create(courseId=scCourseId, body=newStudent)) 
batch1_1.execute() 
time.sleep(1) 
batch1_2.execute() 
time.sleep(1) 
batch1_3.execute() 
time.sleep(1) 

それ仕事、しかし、時々、個々の要求が戻る:

"HttpError 500 ALTをhttps://classroom.googleapis.com/v1/courses/[COURSE ID] /学生を要求するときに= JSONが返さ? ""

を内部エラー"これらの個々の要求については、5xxエラーを受け取ったときに個々の失敗した要求を再試行するようにコードを記述したいと思います。私はこれを実装する方法がわかりません。

現時点では、わずか1人の生徒がコースに参加していない場合は、スクリプト全体を再実行する必要があります。もちろん、リソースの無駄です。

答えて

0

バッチを作成するときに、バッチに追加する各要求に対して呼び出されるコールバック関数を提供できます。をREQUEST_ID

  • コールバックは、3つのパラメータを取りますidはあなたがバッチに追加している要求を(あなたはバッチのadd()メソッドを呼び出すときにそれを渡す識別することを決定します

  • 応答:あなたはAPIを
  • 例外に加えた単一の呼び出しの応答:バッチの要求がエラーをthew場合は例外オブジェクト

以下にロジックを説明する疑似コードがあります。

# sample callback function 
def my_batch_callback(request_id, response, exception): 
    if exception is not None: 
     # Do something with the exception 
     print(exception) 
    else: 
     # Do something with the response 
     print("Request is successful: {}".format(response)) 
    pass 

# creation of batch passing in the call back 
batch = service.new_batch_http_request(callback=my_batch_callback) 

# addition to batch with a specific id 
batch.add(service.object().insert(name="test-1", request_id="id-1")) 
batch.add(service.object().insert(name="test-2", request_id="id-2")) 
batch.add(service.object().insert(name="test-3", request_id="id-3")) 

コールバックを使用すると、誤ったリクエストをIDで保存してもう一度やり直すことができます。これを行うにはさまざまな方法があります。バッチを実行した後に単純なリストを使用して確認したり、専用のクラスを作成して、それが提供する永続性を前進させることができます。

公式文書hereもご覧ください。

関連する問題