Как объявить тайм-аут с помощью urllib2 в Google App Engine? - PullRequest
5 голосов
/ 27 июля 2010

Мне известно, что urllib2 доступно в Google App Engine в качестве оболочки Urlfetch, и, как вы знаете, Universal Feedparser использует urllib2.

Знаете ли вы какой-либо метод для установки времени ожидания для urllib2?
Параметр timeout на urllib2 перенесен в версию Google App Engine?

Меня не интересует такой метод, как:

rssurldata = urlfetch(rssurl, deadline=..)
feedparser.parse(rssurldata)

Ответы [ 4 ]

3 голосов
/ 27 июля 2010

Нет простого способа сделать это, поскольку оболочка не предоставляет способ передать значение тайм-аута, насколько мне известно.Один из возможных вариантов - установить API urlfetch:

old_fetch = urlfetch.fetch
def new_fetch(url, payload=None, method=GET, headers={},
          allow_truncated=False, follow_redirects=True,
          deadline=10.0, *args, **kwargs):
  return old_fetch(url, payload, method, headers, allow_truncated,
                   follow_redirects, deadline, *args, **kwargs)
urlfetch.fetch = new_fetch
1 голос
/ 26 мая 2012

Я предпочитаю это.Это более динамично для обновлений GAE API.

# -*- coding: utf-8 -*-
from google.appengine.api import urlfetch

import settings


def fetch(*args, **kwargs):
    """
    Base fetch func with default deadline settings
    """
    fetch_kwargs = {
        'deadline': settings.URL_FETCH_DEADLINE
    }
    fetch_kwargs.update(kwargs)
    return urlfetch.fetch(
        *args, **fetch_kwargs
    )
0 голосов
/ 23 марта 2015

Вы можете установить крайний срок по умолчанию, который является предпочтительным способом:

from google.appengine.api import urlfetch
import urllib, urllib2


class MyClass():

    def __init__(self):
        urlfetch.set_default_fetch_deadline(10)

У меня есть открывашка, которую я использую urllib2 для включения CookieJar, но тогда вы можете просто делать простые запросы

response = self.opener.open(self.url_login, data_encoded)

Вы можете легко увидеть эффект, если установить крайний срок на 0.1

0 голосов
/ 27 июля 2010

Вы пытались установить значение времени ожидания сокета?Взято из здесь :

Начиная с Python 2.3, вы можете указать, как долго сокет должен ждать ответа до истечения времени ожидания.Это может быть полезно в приложениях, которые должны извлекать веб-страницы.По умолчанию модуль сокета не имеет времени ожидания и может зависать.В настоящее время время ожидания сокета не отображается на уровнях httplib или urllib2.Однако вы можете установить глобальное время ожидания по умолчанию для всех сокетов, используя:

import socket
import urllib2

# timeout in seconds
timeout = 10
socket.setdefaulttimeout(timeout)

# this call to urllib2.urlopen now uses the default timeout
# we have set in the socket module
req = urllib2.Request('http://www.voidspace.org.uk')
response = urllib2.urlopen(req)

Я не уверен, что GAE читает это значение, но оно того стоит!

Редактировать:

urllib2 может передавать параметр тайм-аута:

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

...