Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';t停止线程池执行器_Python_Multithreading_Python Requests_Threadpool_Threadpoolexecutor - Fatal编程技术网

Python Can';t停止线程池执行器

Python Can';t停止线程池执行器,python,multithreading,python-requests,threadpool,threadpoolexecutor,Python,Multithreading,Python Requests,Threadpool,Threadpoolexecutor,我正在抓取数百个url,每个url都有我想要的数据排行榜,每个url字符串之间唯一的区别是“平台”、“区域”,最后是页码。只有几个平台和地区,但页码每天都在变化,我不知道有多少。这是第一个函数,我只是创建要并行请求的URL列表 如果我使用page=1,那么结果将在最后一个函数中包含“table_rows>0”。但是在page=500左右,请求的url仍会ping回来,但速度非常慢,然后会显示一条错误消息,找不到排行榜,最后一个函数会显示“table_rows==0”,等等。问题是我需要快速浏览最

我正在抓取数百个url,每个url都有我想要的数据排行榜,每个url字符串之间唯一的区别是“平台”、“区域”,最后是页码。只有几个平台和地区,但页码每天都在变化,我不知道有多少。这是第一个函数,我只是创建要并行请求的URL列表

如果我使用page=1,那么结果将在最后一个函数中包含“table_rows>0”。但是在page=500左右,请求的url仍会ping回来,但速度非常慢,然后会显示一条错误消息,找不到排行榜,最后一个函数会显示“table_rows==0”,等等。问题是我需要快速浏览最后一页,因此是threadpoolexecutor,但一旦页面限制被触发,我不能取消所有线程或进程或任何内容。我抛出executor.shutdown(cancel\u 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 + '&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()

你好我想知道为什么你使用线程而不是异步请求?老实说,它的代码更少,而且它在不同的项目上工作,实际上它;它是为你想做的事情而设计的。另外,我认为与基于线程的代码相比,它所需的代码(和问题)要少得多。