非同期スクリプトの実行

Embedded Python Execution関数エンドポイント・コールのREST APIのデフォルト・モードは同期であるため、追加のコールを実行する前にREST APIコールが戻る必要があります。非同期モードでコールを実行すると、前のコールが戻るまで待たずに関数エンドポイントを起動できます。

次のステップに従って、スクリプト実行の非同期モードを使用します。

  1. asyncFlagtrueに設定してスクリプト実行関数をコールします。戻り値は、ジョブのステータスをポーリングするために使用できるジョブIDを含む場所です。
  2. ジョブのステータスを取得します。戻り値の202ステータス・コードは、ジョブが保留中であることを示します。302コードは、ジョブが終了したことを示します。ジョブが終了すると、戻り値にはContent-Locationヘッダーが含まれます。
  3. スクリプトの結果をフェッチします。

次に、非同期group-applyコールを実行して結果をフェッチする例を示します。この例では、parallelFlag引数をtrueに設定して、データベースの並列性を使用します。

curl -i -X POST --header "Authorization: Bearer ${token}" \
--header 'Content-Type: application/json' --header 'Accept: application/json' \
-d '{"asyncFlag":true, "input":"select * from IRIS", "parameter":"{\"oml_input_type\":\"pandas.DataFrame\"}", "groupBy":"Species", "orderBy":"Sepal_Length", "parallelFlag":true}' \
"<oml-cloud-service-location-url>/oml/api/py-scripts/v1/group-apply/group_count"  

出力には、ジョブが作成されたことを示すHTTP 201ステータス・コードと、ジョブ・ステータスおよび結果の取得に使用するジョブIDが含まれます。

次の結果では、ジョブが作成されています。

HTTP/1.1 201 Created
Date: Thu, 27 Aug 2020 15:14:04 GMT
Content-Length: 0
Connection: keep-alive
Cache-Control: no-cache, no-store, private
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1;mode=block
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
Set-Cookie: JSESSIONID=node01k14ak2rj75ug1gfbbze9gysl7710.node0; Path=/oml; Secure; HttpOnly
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Location: https://<oml-cloud-service-location-url>/oml/api/py-scripts/v1/jobs/<job id>;

ジョブ・ステータスをポーリングするには、GETメソッドを使用してジョブIDをcURLに渡します。

curl -i -X GET --header "Authorization: Bearer ${token}" \
--header 'Accept: application/json' \
"<oml-cloud-service-location-url>/oml/api/py-scripts/v1/jobs/<job id>"

HTTPレスポンス・ステータス302は、ジョブが終了したことを示します。Content-Locationには結果の場所があります。

HTTP/1.1 302 Found
Date: Thu, 27 Aug 2020 15:14:26 GMT
Content-Length: 0
Connection: keep-alive
Cache-Control: no-cache, no-store, private
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1;mode=block
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
Content-Location: https://<oml-cloud-service-location-url>/oml/api/py-scripts/v1/jobs/<job id>/result

結果を取得します。

curl -i -X GET --header "Authorization: Bearer ${token}" \
--header 'Accept: application/json' \
"<oml-cloud-service-location-url>/oml/api/py-scripts/v1/jobs/<job id>/result"
HTTP/1.1 200 OK
Date: Thu, 27 Aug 2020 15:16:32 GMT
Content-Type: application/json
Content-Length: 5045
Connection: keep-alive
Cache-Control: no-cache, no-store, private
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1;mode=block
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff

結果の一部を次に示します。

{"result":{"versicolor_8":{"SEPAL_LENGTH":{"0":5.7},"SPECIES":{"0":"versicolor"},"COUNT":{"0":5}},
"versicolor_7":{"SEPAL_LENGTH":{"0":5.6},"SPECIES":{"0":"versicolor"},"COUNT":{"0":2}},
"virginica_20":{"SEPAL_LENGTH":{"0":6.7},"SPECIES":{"0":"virginica"},"COUNT":{"0":1}},...}}}

非同期モードでの長時間実行のタイムアウト・パラメータの調整

Embedded Python Execution関数のREST APIエンドポイント・コールのデフォルト・モードは同期であり、スクリプトは60秒後に自動的にタイムアウトします。実行時間が長いスクリプトの場合は、非同期モードを使用します。非同期モードでは、デフォルトのタイムアウトは1800秒です。タイムアウトを調整するには、タイムアウト・パラメータ(秒)を設定し、async_flag=trueを有効にします。次の例では、非同期のtable-apply呼出しを使用し、タイムアウト・パラメータを7200秒に設定しています。

curl -i -X POST --header "Authorization: Bearer <token>" \
  --header 'Content-Type: application/json' \
  --header 'Accept: application/json' \
  -d '{"input":"select * from tablename", "parameters":"{\"oml_input_type\":\"pandas.DataFrame\"}", "asyncFlag":true, "timeout":7200}' \
       "<OML URL>/api/py-scripts/v1/table-apply/scriptname"