python-3.x 异步请求的奇怪错误

k75qkfdt  于 2023-11-20  发布在  Python
关注(0)|答案(1)|浏览(165)
async def rss_downloader(rss):
    global counter
    async with download_limit:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'
        }
        try:
            response = await httpx.get(rss, headers=headers, verify=False)
            if response.status_code == 200:
                r_text = response.text
                await downloaded_rss.put({'url': rss, 'feed': r_text})
            else:
                counter += 1
                print(f'№{counter} - {response.status_code} - {rss}')
        except (
            ConnectTimeout, ConnectionClosed
        ):
            not_found_rss.append(rss)
        except Exception:
            not_found_rss.append(rss)
            logging.exception(f'{rss}')

async def main():
    parser_task = asyncio.create_task(parser_queue())
    tasks = [
        asyncio.create_task(rss_downloader(item['url'])) for item in db[config['mongodb']['channels_collection']].find({'url': {'$ne': 'No RSS'}})
    ]
    await asyncio.gather(*tasks, parser_task)

字符串
很多时候,这段代码无法加载某些页面,导致各种错误。Here is an example的一些错误。但当我尝试一次加载一个相同的页面时,一切都很好:

In [1]: import httpx

In [2]: r = await httpx.get('http://www.spinmob.com/nirvanictrance.xml')

In [3]: r
Out[3]: <Response [200 OK]>

In [4]:


作为一个信号量,我设置了20个工人的限制,这不是那么多,我尝试越来越少-所有的相同,这些错误出现,为什么会发生这种情况,我能做些什么呢?

mkshixfv

mkshixfv1#

httpx文档介绍了您正在使用的ReadTimeout
HTTPX在默认情况下会小心地在所有地方强制超时。默认行为是在网络不活动5秒后引发TimeoutException。read timeout指定等待接收数据块(例如,响应正文的一部分)的最长持续时间。如果HTTPX无法在此时间范围内接收数据,则会引发ReadTimeout异常。
首先尝试禁用读取的超时持续时间(改编自上面链接中的示例):

timeout = httpx.Timeout(10.0, read_timeout=None)
response = await httpx.get(rss, headers=headers, verify=False, timeout=timeout)

字符串
然后尝试不同的超时持续时间,看看对您的用例来说什么是合理的。
编辑:更新了API,参数名从read_timeout改为read

timeout = httpx.Timeout(10.0, read=None)

相关问题