使用Python每隔2分钟提交2个https请求

时间:2018-08-21 13:59:07

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

以下是我的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请求。谢谢

2 个答案:

答案 0 :(得分:0)

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

enter image description here

尽管如此,您要实现的目标不是“废话”,所以我鼓励您寻找其他解决方案。 Lambda的主要目标是异步。在这里,您浪费了2分钟的时间。

您可能要考虑将任务添加到队列(SQS,SNS)或更大的项目中的任何SQL DB。

尽管如此,它也可以与lambda一起使用。您只是浪费了很多资源,lambda并非旨在完成您要完成的任务。

答案 1 :(得分:-1)

我无法测试您的代码,原因是我没有令牌并且我无法理解您的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)