python - 如何解决google api中的 "Process terminated because the request deadline was exceeded. (Error code 123)"?

标签 python mysql database google-app-engine app.yaml

我在具有 Google API (Python) 的 Google App Engine 上部署了一个项目。对任何 API 的每个请求都会建立一个数据库连接,执行一个过程并返回数据并关闭连接。我无法访问显示的任何 API

“进程终止,因为超过了请求截止日期。(错误代码 123)”和“此请求导致为您的应用程序启动新进程,从而导致您的应用程序代码首次加载。此请求因此,与您的应用程序的典型请求相比,可能需要更长的时间并使用更多的 CPU。”错误。

数据库也在云端(Google Cloud SQL)。正如我检查的那样,有 900 个连接并且有超过 150 个实例已启动,但没有处理任何 api 请求。这种情况经常发生。所以我重新启动数据库服务器并再次部署 API 代码来解决这个问题。问题是什么,我怎样才能永久解决这个问题?这是我用于数据库连接的 python 代码:-

import logging
import traceback
import os
import MySQLdb
from warnings import filterwarnings

filterwarnings('ignore', category = MySQLdb.Warning)

class TalkWithDB:
    def callQueries(self,query,req_args):
        try:
            if (os.getenv('SERVER_SOFTWARE') and os.getenv('SERVER_SOFTWARE').startswith('Google App Engine/')):
                db = MySQLdb.connect(unix_socket = UNIX_SOCKET + INSTANCE_NAME, host = HOST, db = DB, user = USER ,charset='utf8',use_unicode=True)
            else:
                db = MySQLdb.connect(host = HOST, port = PORT, db = DB, user = USER, passwd = PASSWORD,charset='utf8',use_unicode=True)

            cursor = db.cursor()
            cursor.connection.autocommit(True)
        try:
        sql = query+str(req_args)
        logging.info("QUERY = "+ sql )
        cursor.execute(sql)     
        procedureResult = cursor.fetchall();
        if str(procedureResult) == '()':
            logging.info("Procedure Returned 0 Record")
            procedureResult = []
            procedureResult.append({0:"NoRecord", 1:"Error"})
            #procedureResult = (("NoRecord","Error",),)
        elif procedureResult[0][0] == 'Session Expired'.encode(encoding='unicode-escape',errors='strict'):
            procedureResult = []
            procedureResult.append({0:"SessionExpired", 1:"Error"})                     
            except Exception, err:
        logging.info("ConnectDB.py : - Error in Procedure Calling :  " + traceback.format_exc())
        #procedureResult = (('ProcedureCallError','Error',),)
        procedureResult = []

        procedureResult.append({0:"ProcedureCallError", 1:"Error"})         

        except Exception, err:
            logging.info("Error In DataBase Connection : " + traceback.format_exc())
           #procedureResult = (('DataBaseConnectionError','Error',),)
        procedureResult = []

        procedureResult.append({0:"DataBaseConnectionError", 1:"Error"})       
# disconnect from server
        finally:
            try:
                cursor.close()
                db.close()
            except Exception, err:
                logging.info("Error In Closing Connection : " + traceback.format_exc())
            return procedureResult

最佳答案

两个可能的改进:

  • 您的实例启动代码可能需要太长的时间,检查启动时间,如果可能的话使用warmup requests以减少启动时间。由于增加空闲实例似乎有所帮助,因此您的启动时间可能会过长。
  • 更好的方法是在 Task Queue 中调用外部服务(例如与 Google 日历对话)在用户请求范围之外。这为您提供了 10 分钟的截止日期,而不是 60 秒的用户请求截止日期

关于python - 如何解决google api中的 "Process terminated because the request deadline was exceeded. (Error code 123)"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30913255/

相关文章:

mysql - 将 SQL 列类型设置为 varchar(50),只接受整数

python - 下载过去一周特定游戏的 50 个 twitch.tv 剪辑

python - 匹配 CSV 中的两列;如果相等,则将值从一个 CSV 复制到另一个 CSV

mysql - 在 WHERE 子句中使用子查询结果列时出现未知列

mysql - 列出所有记录并统计它们在 SQL 中的某个日期范围内使用的次数

mysql - 这个 mySQL 查询有什么问题? (连接和转换)

python - 计算按第二个列表分组的列表值的平均值

python - numpy:沿新轴扩展数组?

mysql 触发器在 wamp 服务器上不起作用

java - 通过jsp页面将表单数据插入到数据库中两个不同的表中