我已经在一个项目中实现了一些线程,我一直在另一个线程中工作,但是评论和问题已经偏离了原帖的主题,所以我认为最好的办法就是提出一个新问题。问题是这个。我希望我的程序在命令行指定的迭代量之后停止迭代while循环。我在以下代码段中传递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解析,然后调用另一个函数,它使用lxml解析的链接进行一些字符串处理,然后调用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
有没有人发现我可能搞砸了哪些会导致程序永远不会停止运行,以及为什么已经被抓取的链接不会被识别出来?
答案 0 :(得分:1)
您实际上并没有将整数10
作为maxsize传递。你正在通过sys.argv[2]
。 sys.argv
是一个字符串列表,所以最好将"10"
作为maxsize参数传递。不幸的是,在Python 2.x中,任何整数都小于任何字符串。您可能希望改为使用int(sys.argv[2])
。