2012-06-29 31 views
0

我有以下代碼:蟒蛇的urllib2 stucks 5秒後6 GET,並且每篇文章之後卡住2秒

def whatever(url, data=None): 
    req = urllib2.Request(url) 
    res = urllib2.urlopen(req, data) 
    html = res.read() 
    res.close() 

我嘗試用它來得到這樣:

for i in range(1,20): 
    whatever(someurl) 

然後,經過前6次表現正確,然後阻塞5秒,並繼續正常工作,休息取得:

2012-06-29 15:20:22,487: Clear [127.0.0.1:49967]: 
2012-06-29 15:20:22,507: Clear [127.0.0.1:49967]: 
2012-06-29 15:20:22,528: Clear [127.0.0.1:49967]: 
2012-06-29 15:20:22,552: Clear [127.0.0.1:49967]: 
2012-06-29 15:20:22,569: Clear [127.0.0.1:49967]: 
2012-06-29 15:20:22,592: Clear [127.0.0.1:49967]: 
**2012-06-29 15:20:26,486: Clear [127.0.0.1:49967]:** 
2012-06-29 15:20:26,515: Clear [127.0.0.1:49967]: 
2012-06-29 15:20:26,555: Clear [127.0.0.1:49967]: 
2012-06-29 15:20:26,586: Clear [127.0.0.1:49967]: 
2012-06-29 15:20:26,608: Clear [127.0.0.1:49967]: 
2012-06-29 15:20:26,638: Clear [127.0.0.1:49967]: 
2012-06-29 15:20:26,655: Clear [127.0.0.1:49967]: 
2012-06-29 15:20:26,680: Clear [127.0.0.1:49967]: 
2012-06-29 15:20:26,700: Clear [127.0.0.1:49967]: 
2012-06-29 15:20:26,717: Clear [127.0.0.1:49967]: 
2012-06-29 15:20:26,753: Clear [127.0.0.1:49967]: 
2012-06-29 15:20:26,770: Clear [127.0.0.1:49967]: 
2012-06-29 15:20:26,789: Clear [127.0.0.1:49967]: 
2012-06-29 15:20:26,809: Clear [127.0.0.1:49967]: 
2012-06-29 15:20:26,828: Clear [127.0.0.1:49967]: 

如果使用POST(with data={'a':'b'}),然後每個請求卡住2秒。我試過urllib2pycurl,他們都給出了相同的結果。

任何人對這種被we behavior的行爲有什麼想法?

回答

1

,以提高性能的另一種方法是使用線程:

import threading, urllib2 
import Queue 

def read_url(url, queue): 
    data = urllib2.urlopen(url).read() 
    print('Fetched %s from %s' % (len(data), url)) 
    queue.put(data) 

def fetch_parallel(): 
    result = Queue.Queue() 
    threads = [threading.Thread(target=read_url, args = (url,result)) for url in urls_to_load] 
    for t in threads: 
     t.start() 
    for t in threads: 
     t.join() 
    return result 

def fetch_sequencial(): 
    result = Queue.Queue() 
    for i in xrange(1, 20): 
     read_url("http://www.stackoverflow.com", result) 
    return result 

給我[完成了0.2秒。

P.S.如果您不需要列表,請使用xrange而不是rangeExplanation

+1

這確實有幫助,但不是問題的根源..我發現最終的原因是pycurl不是線程安全的..切換到urllib2,並使用多線程解決了我的問題。 – pinkdawn

0

問題出在DNS解析器中。

這裏是一個good explanation

您可以使用工具,如this和我想任何其他的DNS解析器將解決問題。

+0

你確定嗎?因爲我在這裏使用的IP地址.. [127.0.0.1:49967] – pinkdawn

+0

其實,在我的本地服務器使用你的代碼一切都很好([完成在0.9s]所有20請求)。 而當你使用這兩種工具,並且這兩種工具都給出相同的結果時,我想這個問題出現在服務器上。 – maxwell

+0

我在django上下文中使用此代碼,並且pycurl在多線程(可能使用本機代碼導致它)下工作不正常,我切換到urllib2,並使用[decorator @async]中的@async(http:// micheles.googlecode.com/hg/decorator/documentation.html#async) – pinkdawn