Queue(maxsize=) 无效?
我在一个项目中实现了一些线程功能,但评论和问题已经偏离了原来的主题,所以我觉得最好是重新提一个问题。问题是这样的:我希望我的程序在命令行指定的迭代次数后停止执行一个循环。我在以下代码段中传递了 Queue.Queue(maxsize=10):
THREAD_NUMBER = 5
def main():
queue = Queue.Queue(maxsize=sys.argv[2])
mal_urls = set(make_mal_list())
for i in xrange(THREAD_NUMBER):
crawler = Crawler(queue, mal_urls)
crawler.start()
queue.put(sys.argv[1])
queue.join()
这是运行函数的部分:
class Crawler(threading.Thread):
def __init__(self, queue, mal_urls):
self.queue = queue
self.mal_list = mal_urls
self.crawled_links = []
threading.Thread.__init__(self)
def run(self):
while True:
self.crawled = set(self.crawled_links)
url = self.queue.get()
if url not in self.mal_list:
self.crawl(url)
else:
print("Malicious Link Found: {0}".format(url))
self.queue.task_done()
self.crawl 是一个函数,它会进行一些 lxml.html 的解析,然后调用另一个函数来处理解析出来的链接的字符串,最后调用 self.queue.put(link),像这样:
def queue_links(self, link, url):
if link.startswith('/'):
link = "http://" + url.netloc + link
elif link.startswith("#"):
return
elif not link.startswith("http"):
link = "http://" + url.netloc + "/" + link
# Add urls extracted from the HTML text to the queue to fetch them
if link not in self.crawled:
self.queue.put(link)
else:
return
有没有人能发现我哪里搞错了,导致程序一直在运行,并且已经爬取过的链接没有被识别出来?
1 个回答
1
你实际上并不是把数字 10
作为最大值传递过去。你传递的是 sys.argv[2]
。sys.argv
是一个字符串列表,所以你传递的最多也就是 "10"
这个字符串。更糟糕的是,在 Python 2.x 中,任何数字都比任何字符串小。你可能想用 int(sys.argv[2])
来代替。