2010-07-24 46 views
0

好吧,我有很多問題讓我的工作開發服務器工作到生產服務器:)。我有一個任務會通過並請求網址並收集和更新數據。運行需要30分鐘。<class'google.appengine.runtime.DeadlineExceededError'>:如何解決?

我上傳到生產服務器,並在30秒後轉到與其對應的.py腳本appname.appspot.com/tasks/rrs的網址我得到類google.appengine.runtime.DeadlineExceededError'有沒有辦法解決這個問題?這是一頁30秒的截止日期嗎?此腳本在開發服務器中正常工作,我轉到url並關聯.py腳本運行直到完成。

import time 
import random 
import string 
import cPickle 
from StringIO import StringIO 
try: 
    import json 
except ImportError: 
    import simplejson as json 
import urllib 
import pprint 
import datetime 
import sys 
sys.path.append("C:\Program Files (x86)\Google\google_appengine") 
sys.path.append("C:\Program Files (x86)\Google\google_appengine\lib\yaml\lib") 
sys.path.append("C:\Program Files (x86)\Google\google_appengine\lib\webob") 
from google.appengine.api import users 
from google.appengine.ext import webapp 
from google.appengine.ext.webapp.util import run_wsgi_app 
from google.appengine.ext import db 
class SR(db.Model): 
    name = db.StringProperty() 
    title = db.StringProperty() 
    url = db.StringProperty() 

##request url and returns JSON_data 
def overview(page): 
    u = urllib.urlopen(page) 
    bytes = StringIO(u.read()) 
    ##print bytes 
    u.close() 
    try: 
     JSON_data = json.load(bytes) 
     return JSON_data 
    except ValueError,e: 
     print e," Couldn't get .json for %s" % page 
     return None 

##specific code to parse particular JSON data and append new SR objects to the given url list 
def parse_json(JSON_data,lists): 
    sr = SR() 
    sr.name = ##data gathered 
    sr.title = ##data gathered 
    sr.url = ##data gathered 
    lists.append(sr) 
    return lists 

## I want to be able to request lets say 500 pages without timeing out 
page = 'someurlpage.com'##starting url 
url_list = [] 
for z in range(0,500): 
    page = 'someurlpage.com/%s'%z 
    JSON_data = overview(page)##get json data for a given url page 
    url_list = parse_json(JSON_data,url_list)##parse the json data and append class objects to a given list 
db.put(url_list)##finally add object to gae database 

回答

4

是的,App Engine規定了30秒的最後期限。其中一種方法可能是try/except DeadlineExceededError,其餘部分放在taskqueue

但是,您無法讓您的請求長時間運行。

您也可以嘗試Bulkupdate

例子:

class Todo(db.Model): 
    page = db.StringProperty() 

class BulkPageParser(bulkupdate.BulkUpdater): 
    def get_query(self): 
     return Todo.all() 

    def handle_entity(self, entity): 
     JSON_data = overview(entity.page) 
     db.put(parse_json(JSON_data, []) 
     entity.delete() 

# Put this in your view code: 
for i in range(500): 
    Todo(page='someurlpage.com/%s' % i).put() 

job = BulkPageParser() 
job.start() 
+0

wtf,所以讓我們假設我有一大串我想在for循環中請求的URL,收集數據並在放入db.class實例之前將其放入列表中。最好的方法是什麼? – user291071 2010-07-24 17:05:52

+0

將模型列表放入模型中,並使用bulkupdate執行隊列。 Atleast ...我認爲這將是最簡單的解決方案;) – Wolph 2010-07-24 17:29:05

+0

是的,但我需要反覆請求網址和更新信息的for循環不只是上傳的網址,我正在尋找一個例子代碼請求很多網址的人一個避免超時錯誤的for循環。 – user291071 2010-07-24 18:43:11

0

好了,所以如果我動態添加鏈接爲我解析的頁面,像這樣我相信我會添加到待辦事項隊列。

def handle_entity(self, entity): 
    JSON_data = overview(entity.page) 
    data_gathered,new_links = parse_json(JSON_data, [])##like earlier returns the a list of sr objects, and now a list of new links/pages to go to 
    db.put(data_gathered) 
    for link in new_links: 
     Todo(page=link).put() 
    entity.delete() 
+0

@ user291071:正確:) – Wolph 2010-07-24 23:24:56

+0

嘿WoLph,另一個簡單的跟進,我有代碼到目前爲止,但批處理執行速度非常快,我如何更改上述代碼,以便一次只執行一個請求/批處理。我在句柄實體中放置了1秒的延遲,並且每1秒只需要一個url請求,所以我需要將批量限制爲1個請求。我目前的代碼似乎什麼都不做,用我的PUT_BATCH_SIZE選項。 – user291071 2010-07-29 16:42:09