Не удается остановить ThreadPoolExecutor

#python #multithreading #python-requests #threadpool #threadpoolexecutor

#python #многопоточность #python-запросы #threadpool #threadpoolexecutor

Вопрос:

Я очищаю сотни URL-адресов, каждый из которых содержит список данных, которые я хочу, и единственная разница между каждой строкой URL-адреса — это «платформа», «регион» и, наконец, номер страницы. Существует всего несколько платформ и регионов, но номера страниц меняются каждый день, и я не знаю, сколько их. Итак, это первая функция, я просто создаю списки URL-адресов, которые будут запрашиваться параллельно.

Если я использую page= 1, то результат будет содержать ‘table_rows> 0’ в последней функции. Но около page = 500 запрошенный URL-адрес по-прежнему возвращается, но очень медленно, а затем отображается сообщение об ошибке, таблица лидеров не найдена, последняя функция покажет ‘table_rows == 0’ и т. Д. Проблема в том, что мне нужно пройти самую последнюю страницу, и я хочу сделать это быстро, отсюда и threadpoolexecutor — но я не могу отменить все потоки или процессы или что-то еще, как только PAGE_LIMIT отключен. Я бросил исполнителя.завершение работы (cancel_futures=True) просто для того, чтобы показать, что я ищу. Если никто не сможет мне помочь, я с треском удалю распараллеливание и буду медленно, печально очищать один URL-адрес за раз…

Спасибо

 from concurrent.futures import ThreadPoolExecutor
from bs4 import BeautifulSoup 
import pandas
import requests

PLATFORM = ['xbl', 'psn', 'atvi', 'battlenet']
REGION = ['us', 'ca']
PAGE_LIMIT = True
def leaderboardLister():
    global REGION
    global PLATFORM
    list_url = []
    for region in REGION:
        for platform in PLATFORM:
            for i in range(1,750):
                list_url.append('https://cod.tracker.gg/warzone/leaderboards/battle-royale/'   platform   '/KdRatio?country='   region   'amp;page='   str(i))
                
            leaderboardExecutor(list_url,30)
            
def leaderboardExecutor(urls,threads):
    global PAGE_LIMIT
    global INTERNET
    if len(urls) > 0:                       
        with ThreadPoolExecutor(max_workers=threads) as executor:
            while True:
                if PAGE_LIMIT == False:
                    executor.shutdown(cancel_futures=True)

            while INTERNET == False:
                try:
                    print('bad internet')
                    requests.get("http://google.com")
                    INTERNET = True
                except:
                    time.sleep(3)
                    print('waited')
            
            executor.map(scrapeLeaderboardPage, urls)
    
    
def scrapeLeaderboardPage(url):
    global PAGE_LIMIT
    checkInternet()
    try:
        page = requests.get(url)
        soup = BeautifulSoup(page.content,features = 'lxml')
        table_rows = soup.find_all('tr')
        if len(table_rows) == 0:
            PAGE_LIMIT = False 
            print(url)
        else:
            pass
        print('success')
        

    except:
        INTERNET = False

leaderboardLister()
  

Комментарии:

1. Привет! Мне было интересно, почему вы используете потоки вместо асинхронных запросов?

2. Честно говоря, это меньше кода, и он работал над другим проектом

3. На самом деле он предназначен для того же, что вы хотите сделать. Кроме того, я думаю, что это займет гораздо меньше кода (и проблем), чем код на основе потоков.