Python多线程使用concurrent.futures.as_completed方法下的一个坑

在使用Python3.7的时候,将获取到的url放入到队列Queue中,如下:这里的content_list是爬取到的列表

queue = Queue(list(content_list).__len__())

然后使用线程池ThreadPoolExecutor的时候将队列放到任务中,如下:

with ThreadPoolExecutor(max_workers=1) as executor:
            task_list = [executor.submit(self.get_detailed_info, queue.get()) for i in range(list(content_list).__len__())]
            for item in concurrent.futures.as_completed(task_list):
                print('done')

重点是在循环的时候,我这里写的是range(list(content_list).__len__()),因为我爬取的页面经过筛选,所以最后的队列中的url与原本的url数量不一致,所以最后在使用concurrent.futures.as_completed方法获取线程返回值的时候会获取不到,所以这里必须需要将循环的值设置为队列queue的长度,可以改为:range(queue.qsize()),如下

with ThreadPoolExecutor(max_workers=1) as executor:
            task_list = [executor.submit(self.get_detailed_info, queue.get()) for i in range(queue.qsize())]
            for item in concurrent.futures.as_completed(task_list):
                print('done')

这里具体原因,我认为是在executor.submit这方法中循环获取url数据的时候发现了我们的循环次数与实际不符合,所以不返回线程的数据,在此记录一下。

你可能感兴趣的:(Python,Python,多线程)