Использование urllib2 в Google App Engine приводит к превышению крайнего срока при ожидании ответа HTTP от URL:

Я использую urllib2 для Google App Engine (GAE) на python. Очень часто приложение вылетает из-за следующей ошибки:

Превышен крайний срок при ожидании ответа HTTP от URL: ....

Источник выглядит так:

import webapp2
import urllib2
from bs4 import BeautifulSoup

def functionRunning2To5Seconds_1()    
    #Check if the Url could be parsed
    try:
        url         ="http://...someUrl..."
        req         = urllib2.Request(url,headers={'User-Agent': 'Mozilla/5.0'})
        page        = urllib2.urlopen(req)
        htmlSource  = BeautifulSoup(page)
    except Exception  e:
        logging.info("Error : {er}".format(er=str(e)))

    #do some calculation with the data of htmlSource, which takes 2 To 5 Seconds

#and the handler looks like:
class xyHandler(webapp2.RequestHandler):
    def post(self, uurl=None):
        r_data1 = functionRunning2To5Seconds_1()
        r_data2 = functionRunning2To5Seconds_2()
        r_data3 = functionRunning2To5Seconds_3()
        ...
        #show the results in a web page

Я нашел этот документ, в котором говорится:

Вы можете использовать стандартные библиотеки Python urllib, urllib2 или httplib для выполнения HTTP-запросов. При работе в App Engine эти библиотеки выполняют HTTP-запросы с помощью службы получения URL-адресов App Engine.

и это:

Вы можете установить крайний срок для запроса, максимальное количество времени, в течение которого служба будет ждать ответа. По умолчанию крайний срок получения составляет 5 секунд. Максимальный крайний срок составляет 60 секунд для HTTP-запросов и 60 секунд для запросов очереди задач и заданий cron.

Итак, КАК мне это сделать? Как установить тайм-аут на urllib2?

Или мне нужно переписать все приложение, чтобы использовать службу получения URL-адресов App Engine?

(PS: Кто-нибудь знает безопасный способ параллельного выполнения вызовов "r_data1 = functionRunning2To5Seconds _... ()"?)


person user1911091    schedule 23.09.2014    source источник


Ответы (2)


https://docs.python.org/2/library/urllib2.html

urllib2.urlopen(url[, data][, timeout])

Необязательный параметр тайм-аута указывает тайм-аут в секундах для блокирующих операций, таких как попытка подключения (если не указан, будет использоваться глобальная настройка тайм-аута по умолчанию).

person Paul Collingwood    schedule 23.09.2014

Как предложил Пол, вы можете передать параметр тайм-аута. В App Engine он привязан к получению URL и устанавливает крайний срок до 60 секунд. Имейте в виду, что если urlopen занимает больше времени, чем указано в параметре тайм-аута, вы получите DeadlineExceededError из google.appengine.api.urlfetch_errors.DeadlineExceededError вместо обычного socket.timeout. Рекомендуется поймать эту ошибку и при необходимости повторить попытку / войти в журнал. См. [1] для получения дополнительной информации о работе с DeadlineExceededError.

[1] - https://developers.google.com/appengine/articles/deadlineexceedederrors

person Nikita Uchaev    schedule 23.09.2014
comment
Откуда у вас ограничение в 10 секунд? Все, что я могу найти, это 60 секунд. Это что-то особенное, или это просто опечатка? - person user1911091; 24.09.2014
comment
Опечатка, извините. Предел составляет 60 секунд / 10 минут (очереди задач). - person Nikita Uchaev; 24.09.2014