使用Python以2分钟的间隔提交2个https请求

使用Python以2分钟的间隔提交2个https请求,python,python-2.7,amazon-web-services,aws-lambda,Python,Python 2.7,Amazon Web Services,Aws Lambda,下面是我的python代码,我尝试运行2个https请求,第一个启动我的databrick集群。因为集群启动大约需要2分钟,所以我尝试让time.sleep保持2分钟,然后提交第二个https以运行databricks作业。这些是从我的AWS Lambda运行的。我也尝试过AWS步进函数,但是我得到了不同的错误,因此决定使用lambda from __future__ import print_function import json import boto3 import time impor

下面是我的python代码,我尝试运行2个https请求,第一个启动我的databrick集群。因为集群启动大约需要2分钟,所以我尝试让time.sleep保持2分钟,然后提交第二个https以运行databricks作业。这些是从我的AWS Lambda运行的。我也尝试过AWS步进函数,但是我得到了不同的错误,因此决定使用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请求。谢谢

我无法测试你的代码,因为我没有令牌,也无法理解你的API文档,但也许你可以在第一个请求的相同范围内输入第二个请求,因此当第一个请求完成时,如果状态码为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)

Lambda最多可活几个小时,最多可处理一个请求五分钟。你唯一能控制的就是它的超时。默认情况下,它设置为3秒。我把它设为30秒

尽管如此,您试图实现的并不是“羔羊式”,因此我鼓励您寻找不同的解决方案。lambdas的主要目标是异步。在这里你浪费了2分钟的时间

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


即使如此,它也可以很好地与lambdas配合使用。您只是浪费了大量资源,而lambda并不是为完成您想要完成的任务而设计的。

答案是3秒。图为30秒。是哪一个?好吧,看看你在AWS上的配置。我为我的脚本设置了30秒。这就是我的配置。睡眠几乎总是一个错误的解决方案,延迟到某项任务完成。相反,完成后应发送一些信号。您可能应该查看队列,包括外部队列和内存队列。