队列(maxsize =)不起作用?

时间:2010-11-01 00:10:58

标签: python set threadpool

我已经在一个项目中实现了一些线程,我一直在另一个线程中工作,但是评论和问题已经偏离了原帖的主题,所以我认为最好的办法就是提出一个新问题。问题是这个。我希望我的程序在命令行指定的迭代量之后停止迭代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

有没有人发现我可能搞砸了哪些会导致程序永远不会停止运行,以及为什么已经被抓取的链接不会被识别出来?

1 个答案:

答案 0 :(得分:1)

您实际上并没有将整数10作为maxsize传递。你正在通过sys.argv[2]sys.argv是一个字符串列表,所以最好将"10"作为maxsize参数传递。不幸的是,在Python 2.x中,任何整数都小于任何字符串。您可能希望改为使用int(sys.argv[2])