【发布时间】:2012-05-29 13:53:40
【问题描述】:
你好!我正在尝试用 python 编写网络爬虫。我想使用python多线程。即使在阅读了早期建议的论文和教程之后,我仍然有问题。我的代码在这里(整个源代码是here):
class Crawler(threading.Thread):
global g_URLsDict
varLock = threading.Lock()
count = 0
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
self.url = self.queue.get()
def run(self):
while 1:
print self.getName()+" started"
self.page = getPage(self.url)
self.parsedPage = getParsedPage(self.page, fix=True)
self.urls = getLinksFromParsedPage(self.parsedPage)
for url in self.urls:
self.fp = hashlib.sha1(url).hexdigest()
#url-seen check
Crawler.varLock.acquire() #lock for global variable g_URLs
if self.fp in g_URLsDict:
Crawler.varLock.release() #releasing lock
else:
#print url+" does not exist"
Crawler.count +=1
print "total links: %d"%len(g_URLsDict)
print self.fp
g_URLsDict[self.fp] = url
Crawler.varLock.release() #releasing lock
self.queue.put(url)
print self.getName()+ " %d"%self.queue.qsize()
self.queue.task_done()
#self.queue.task_done()
#self.queue.task_done()
print g_URLsDict
queue = Queue.Queue()
queue.put("http://www.ertir.com")
for i in range(5):
t = Crawler(queue)
t.setDaemon(True)
t.start()
queue.join()
它没有按需要工作,它在线程 1 之后没有给出任何结果,并且它执行的方式不同,有时会出现此错误:
Exception in thread Thread-2 (most likely raised during interpreter shutdown):
我该如何解决?而且我认为这并不比 for 循环更有效。
我已尝试修复 run():
def run(self):
while 1:
print self.getName()+" started"
self.page = getPage(self.url)
self.parsedPage = getParsedPage(self.page, fix=True)
self.urls = getLinksFromParsedPage(self.parsedPage)
for url in self.urls:
self.fp = hashlib.sha1(url).hexdigest()
#url-seen check
Crawler.varLock.acquire() #lock for global variable g_URLs
if self.fp in g_URLsDict:
Crawler.varLock.release() #releasing lock
else:
#print url+" does not exist"
print self.fp
g_URLsDict[self.fp] = url
Crawler.varLock.release() #releasing lock
self.queue.put(url)
print self.getName()+ " %d"%self.queue.qsize()
#self.queue.task_done()
#self.queue.task_done()
self.queue.task_done()
我在不同的地方试验了 task_done() 命令,谁能解释一下区别?
【问题讨论】:
-
第一个示例是否缺少一些缩进?看起来班级成员应该被推入一级..?
-
你能发布一个工作示例吗?你导入了哪些模块?
-
snipt.org/ujhW9 工作源代码
-
我很困惑。您创建 5 个线程,每个线程从队列中读取一次。然后很多 url 从前五页添加到队列中,但它们从未被读取?
-
什么意思?它们被添加到队列中,但线程也会从该队列中读取 url。
标签: python multithreading thread-safety web-crawler