2010-07-26 24 views
5

Tôi biết rằng urllib2 có sẵn trên Google App Engine dưới dạng trình bao bọc của Urlfetch và, như bạn biết, Universal Feedparser sử dụng urllib2.Làm cách nào để khai báo thời gian chờ bằng cách sử dụng urllib2 trên Google App Engine?

Bạn có biết phương pháp nào để đặt thời gian chờ trên urllib2 không?
Thông số timeout trên urllib2 đã được chuyển trên phiên bản Google App Engine chưa?

Tôi không quan tâm đến phương pháp như:

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

có một lý do cụ thể mà bạn không muốn sử dụng phương pháp đơn giản hơn mà bạn vừa phác thảo? –

+0

@Nick Xin chào :)! Uhm, đơn giản vì thư viện thu thập dữ liệu nguồn cấp dữ liệu mà tôi đang làm việc có thể được niêm phong và nên ở lại gae bất khả tri. Bạn có thể trỏ tôi đến trình bao bọc urllib2 trên mã nguồn gae không? Tôi cũng không biết nếu thời gian chờ urllib2 hiện tại được đặt thành 5 giây hoặc tối đa 10 giây (MAX Urlfetch Hạn chót) – systempuntoout

+0

Trình bao bọc để hết thời gian chờ ở thời gian mặc định là 5 giây.Tôi không biết bất kỳ cách nào để chuyển một giá trị thời gian chờ thông qua trình bao bọc tới API urlfetch. Tuy nhiên, về sự kết thúc của mọi thứ, bạn luôn có thể sử dụng API urlfetch để mặc định là 10 giây ... –

Trả lời

3

Không có cách nào đơn giản để thực hiện việc này, vì trình bao bọc không cung cấp cách để vượt qua giá trị hết thời gian chờ theo sự hiểu biết tốt nhất của tôi. Một tùy chọn hackish sẽ là monkeypatch 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 
+0

vị trí chính xác để vá lỗi này ở đâu? Trên chính hoặc thẳng trước khi cuộc gọi đến thư viện thu thập thông tin? – systempuntoout

+0

Cấp cao nhất trong bất kỳ mô-đun nào được nhập trước khi bạn sử dụng API. –

+0

hoạt động như một sự quyến rũ, cảm ơn. – systempuntoout

-3

Bạn đã cố gắng thiết lập giá trị timeout ổ cắm? Lấy từ here:

Kể từ Python 2.3, bạn có thể chỉ định khoảng thời gian một ổ cắm sẽ đợi phản hồi trước khi hết thời gian. Điều này có thể hữu ích trong các ứng dụng phải tìm nạp các trang web. Theo mặc định, mô-đun ổ cắm không có thời gian chờ và có thể treo. Hiện tại, thời gian chờ của ổ cắm không được phơi bày ở mức độ httplib hoặc urllib2. Tuy nhiên, bạn có thể đặt thời gian chờ mặc định trên toàn cầu cho tất cả các ổ cắm bằng cách sử dụng:

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) 

Tôi không chắc liệu GAE có đọc giá trị này hay không nhưng nó đáng giá!

Edit:

urllib2 có khả năng để vượt qua một tham số thời gian chờ:

Thời gian chờ tùy chọn tham số quy định cụ thể một thời gian chờ trong vài giây cho hoạt động ngăn chặn như nỗ lực kết nối (nếu không quy định, cài đặt thời gian chờ mặc định toàn cầu sẽ được sử dụng). Điều này thực sự chỉ hoạt động cho các kết nối HTTP, HTTPS, FTP và FTPS .

+0

vâng, đây là lần thử đầu tiên của tôi. Socket đã không setdefaulttimeout phương pháp trên gae :) Cảm ơn thời gian của bạn mặc dù. – systempuntoout

+0

Còn tham số timeout của urllib2 thì sao? – advait

+0

Tôi đang hỏi "Tham số thời gian chờ trên urllib2 đã được chuyển trên phiên bản Google App Engine chưa?". – systempuntoout

1

Tôi thích điều này. Việc cập nhật API GAE linh hoạt hơn.

# -*- 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

Bạn có thể thiết lập thời hạn mặc định đó là cách ưa thích:

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


class MyClass(): 

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

Tôi có một cái mở Tôi sử dụng của urllib2 cho phép các CookieJar, nhưng bạn có thể sau đó chỉ cần làm yêu cầu đơn giản

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

bạn có thể dễ dàng nhìn thấy hiệu quả nếu bạn thiết lập thời hạn cuối cùng để 0.1

Các vấn đề liên quan