對於您的示例創建工作隊列可能矯枉過正。如果您抓取爲每個頁面發佈的rss提要,而不是嘗試解析速度較慢的HTML,那麼您可能會有更好的運氣。我把下面這個快速的小腳本放在一起,總共解析它〜13秒...〜8秒鐘抓住城市,5秒鐘解析全部 rss饋送。
在今天的運行中,它從13個城市(總共有20個城市上市,但其中7個被列爲「即將推出」)獲得310個總交易。
#!/usr/bin/env python
from lxml import etree, html
from urlparse import urljoin
import time
t = time.time()
base = 'http://scoutmob.com/'
main = html.parse(base)
cities = [x.split('?')[0] for x in main.xpath("//a[starts-with(@class, 'cities-')]/@href")]
urls = [urljoin(base, x + '/today') for x in cities]
docs = [html.parse(url) for url in urls]
feeds = [doc.xpath("//link[@rel='alternate']/@href")[0] for doc in docs]
# filter out the "coming soon" feeds
feeds = [x for x in feeds if x != 'http://feeds.feedburner.com/scoutmob']
print time.time() - t
print len(cities), cities
print len(feeds), feeds
t = time.time()
items = [etree.parse(x).xpath("//item") for x in feeds]
print time.time() - t
count = sum(map(len, items))
print count
此息率輸出:
7.79690480232
20 ['/atlanta', '/new-york', '/san-francisco', '/washington-dc', '/charlotte', '/miami', '/philadelphia', '/houston', '/minneapolis', '/phoenix', '/san-diego', '/nashville', '/austin', '/boston', '/chicago', '/dallas', '/denver', '/los-angeles', '/seattle', '/portland']
13 ['http://feeds.feedburner.com/scoutmob/atl', 'http://feeds.feedburner.com/scoutmob/nyc', 'http://feeds.feedburner.com/scoutmob/sf', 'http://scoutmob.com/washington-dc.rss', 'http://scoutmob.com/nashville.rss', 'http://scoutmob.com/austin.rss', 'http://scoutmob.com/boston.rss', 'http://scoutmob.com/chicago.rss', 'http://scoutmob.com/dallas.rss', 'http://scoutmob.com/denver.rss', 'http://scoutmob.com/los-angeles.rss', 'http://scoutmob.com/seattle.rss', 'http://scoutmob.com/portland.rss']
4.76977992058
310
「我想每個工人搶從隊列中未處理的URL,以及數據挖掘,那麼一旦完成,」就是答案。你還想知道什麼?你問如何使用隊列的get方法? – 2012-02-19 00:12:11
我想我不是線程將如何保持「打開」,直到隊列中沒有更多項目。我是否需要首先完全填充隊列,才能像隊列中的「實時」連接一樣創建隊列,並且線程一直工作,直到我告訴它停止? – hobbes3 2012-02-21 21:38:50
我無法理解你的問題。你是否假設當隊列爲空時線程都會神奇地停止?他們爲什麼要那樣做? – 2012-02-21 22:03:04