Queue(maxsize=) 无效?

1 投票
1 回答
673 浏览
提问于 2025-04-16 06:22

我在一个项目中实现了一些线程功能,但评论和问题已经偏离了原来的主题,所以我觉得最好是重新提一个问题。问题是这样的:我希望我的程序在命令行指定的迭代次数后停止执行一个循环。我在以下代码段中传递了 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]) 来代替。

撰写回答