【问题标题】:Submitting 2 https requests in 2 minute interval using Python使用 Python 在 2 分钟间隔内提交 2 个 https 请求
【发布时间】:2019-01-27 17:52:15
【问题描述】:

以下是我的 python 代码,我尝试运行 2 个 https 请求,第一个启动我的 databrick 集群。由于集群启动大约需要 2 分钟,我试图让 time.sleep 2 分钟,然后提交我的第二个 https 以运行 databricks 作业。这些是从我的 AWS Lambda 运行的。我也尝试过使用 AWS Step 功能,但遇到了不同的错误,因此决定使用 lambda。

from __future__ import print_function
import json
import boto3
import time
import urllib
import re
import pymysql
import sys
import requests
import base64
import time

s3 = boto3.client('s3')
domain = 'mydatabricks.cloud.databricks.com'
tokenStr = 'token:tokenstr'


def lambda_handler(event, context):

    response = requests.post('https://%s/api/2.0/clusters/start' % (domain),
    headers = {"Authorization": "Basic " + base64.standard_b64encode(tokenStr)},
    json = {"cluster_id": "ddddd-sss23-2232323"})
    seconds = 200
    time.sleep(seconds)
    if response.status_code == 200:
        print("slept for seconds : ", str(seconds))
        print("Cluster started / completed successfully ***************")
    else:
        print ("Error in starting cluster !!!!!!!!!!!!!! %s: %s" % (response.json()["error_code"], response.json()["message"]))

    #time.sleep(180)
    while True:
        try:
            response2 = requests.post('https://%s/api/2.0/jobs/run-now' % (domain),
            headers = {"Authorization": "Basic " + base64.standard_b64encode(tokenStr)},
            json = {"job_id": 12345})
        except Exception as e:
            print(e)
            time.sleep(180)

    #   if response2.status_code == "INVALID_STATE":
    #    print("Job started / completed successfully ***************")
    #else:
    #    print ("Error in running the job 28885 !!!!!!!!!!!!!! %s: %s" % (response2.json()["error_code"], response2.json()["message"]))

上面的错误信息是:

2018-08-21T13:47:26.542Z baa565b5-a548-11e8-9585-8d99dc1af95e Task timed out after 3.00 seconds

请帮助如何以第一个请求的间隔/状态提交 2 个 https 请求。谢谢

【问题讨论】:

  • 睡眠几乎总是延迟某些任务完成的错误解决方案。相反,应该在完成后发送一些信号。您可能应该查看队列,包括外部队列和内存队列。

标签: python python-2.7 amazon-web-services aws-lambda


【解决方案1】:

Lambda 可以存活几个小时,最多可以处理一个请求 5 分钟。您唯一可以控制的是它的超时。默认情况下,它设置为 3 秒。这里我设置为 30 秒。

尽管如此,您想要完成的不是“羔羊肉”,所以我鼓励您寻找不同的解决方案。 lambdas 的主要目标是异步的。在这里你浪费了 2 分钟的时间。

如果项目更大,您可能需要考虑将任务添加到队列(SQS、SNS)或任何 SQL 数据库中。

尽管如此,它也可以很好地与 lambda 一起使用。您只会浪费大量资源,而 lambdas 并非旨在完成您想要完成的工作。

【讨论】:

  • 回答说 3 秒。图像显示 30 秒。是哪个?
  • 好吧,看看你在 AWS 上的配置。我为我的脚本设置了 30 秒。这是我的配置。
【解决方案2】:

我无法测试您的代码,因为我没有令牌并且我无法理解您的 API 文档,但也许您可以在第一个请求的相同范围内输入您的第二个请求,因此您的第二个请求将在第一个完成时发生,如果statuscode 是 200。类似的东西,所以我无法测试代码

s3 = boto3.client('s3')
domain = 'mydatabricks.cloud.databricks.com'
tokenStr = 'token:tokenstr'

response = requests.post('https://%s/api/2.0/clusters/start' % (domain),
           headers = {"Authorization": "Basic " + base64.standard_b64encode(tokenStr)},
           json = {"cluster_id": "ddddd-sss23-2232323"})

if response.status_code == 200:
       response2 = requests.post('https://%s/api/2.0/jobs/run-now' % (domain),
                   headers = {"Authorization": "Basic " + 
                   base64.standard_b64encode(tokenStr)},
                   json = {"job_id": 12345})

print(response2.statuscode)

【讨论】:

    猜你喜欢
    • 2017-08-31
    • 2020-04-01
    • 2018-01-25
    • 2017-02-04
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    相关资源
    最近更新 更多