是否可以在不运行google app engine webservice的情况下运行处理用户数据的脚本?
使用较小的脚本可以很好地工作但是当我的脚本持续大约40分钟时,我收到错误:MAP_FIXED
我的临时修复是在Windows VM上使用Windows调度程序,在python脚本中使用命令行
编辑:已添加代码
DeadlineExceededError
答案 0 :(得分:2)
默认情况下,App Engine服务使用automatic scaling,其对HTTP请求的限制为60秒,对任务队列请求的限制为10分钟。如果您将服务更改为使用基本或手动扩展,那么您的任务队列请求最多可以运行24小时。
听起来您可能只需要一个实例来完成这项工作,因此除了默认服务之外,还可以创建第二个service。在子文件夹中,使用以下bqservice
设置创建app.yaml
文件夹,该设置使用最多一个实例的基本缩放:
# bqsservice/app.yaml
# Possibly use a separate service for your BQ code than
# the rest of your app:
service: bqservice
runtime: python27
api_version: 1
# Keep low memory/cost B1 class?
instance_class: B1
# Limit max services to 1 to keep costs down. There is an
# 8 instance hour limit to the free tier. This option still
# scales to 0 when not in use.
basic_scaling:
max_instances: 1
# Handlers:
handlers:
- url: /.*
script: main.app
然后在同一服务中创建cron.yaml
以安排脚本运行。使用上面的示例配置,您可以将BigQuery逻辑放入main.py文件中,并在其中定义WSGI应用程序:
# bqservice/main.py
import webapp2
class CronHandler(webapp2.RequestHandler):
def post(self):
# Handle your cron work
# ....
app = webapp2.WSGIApplication([
#('/', MainPage), # If you needed other handlers
('/mycron', CronHandler),
], debug=True)
如果您不打算将App Engine应用程序用于其他任何事情,则可以将此全部用于默认服务。如果除了默认服务之外还执行此操作,则首先需要将某些内容部署到默认服务,即使它只是一个带有静态文件的简单app.yaml
。
答案 1 :(得分:0)
大多数BigQuery操作都可以异步运行。你能告诉我们你的代码吗?
例如,来自Python BigQuery文档:
begin()
这是一个异步作业,代码选择等待查询完成。而不是等待,在if
之后获取作业ID。您可以使用Task Queue将任务排入队列,以检查该作业的结果。