程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

关注本站官方公众号:程序员总部,领取三大福利!
福利一:python和前端辅导
福利二:进程序员交流微信群,专属于程序员的圈子
福利三:领取全套零基础视频教程(python,java,前端,php)

  价值13000svip视频教程,python大神匠心打造,零基础python开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

为什么 aiohttp/asyncio 在一定数量的 url 之后停止运行?

发布于2022-09-17 08:06     阅读(1031)     评论(0)     点赞(28)     收藏(4)


当我运行下面的代码时,如果我将 url 的数量分割为 10 000,它将停止在 url 编号 9983 处工作,但终端中没有显示错误,代码只是停止运行(如冻结)。

如果我将 url 的数量分割为 5000,则行为相同,它会在到达第 5000 个 url 之前停止运行。

奇怪的是,如果我将 url 列表分割为 1000 个 url,则该代码有效。

我真的不知道问题出在哪里,我想它与 aiohttp 或 asyncio 的参数有关,我必须在某处添加以增加授权请求的数量。

这是我当前的代码:

import asyncio
import time

import aiohttp
import pandas as pd


found = 0
not_found = 0
counter = 0

async def download_site(session, url):
    global found, not_found, counter
    async with session.get(url) as response:
        if str(response.url) == 'https://fake.notfound.url.com':
            print('\n\n', response.url, '\n\n')
            not_found += 1
        else:
            found += 1
        counter += 1
        print(counter)


async def download_all_sites(sites):
    session_timeout = aiohttp.ClientTimeout(total=None)
    async with aiohttp.ClientSession(timeout=session_timeout) as session:
        tasks = []
        for url in sites:
            task = asyncio.ensure_future(download_site(session, url))
            tasks.append(task)
        await asyncio.gather(*tasks)


if __name__ == "__main__":

    df = pd.read_csv('database_table.csv', sep=';', encoding='utf-8')

    sites = df['urls'].tolist()

    start_time = time.time()
    asyncio.get_event_loop().run_until_complete(download_all_sites(sites[7000:17000]))
    duration = time.time() - start_time

    print(f'404: {not_found / len(sites[7000:17000]) * 100} %')
    print(f'200: {found / len(sites[7000:17000]) * 100} %')

很长一段时间后,我按下Ctrl+C并得到此错误跟踪:

^CTraceback (most recent call last):
  File "/home/takamura/Documents/corp/scripts/misc_scripts/links_checker.py", line 74, in <module>
    
  File "/usr/lib/python3.9/asyncio/base_events.py", line 629, in run_until_complete
    self.run_forever()
  File "/usr/lib/python3.9/asyncio/base_events.py", line 596, in run_forever
    self._run_once()
  File "/usr/lib/python3.9/asyncio/base_events.py", line 1854, in _run_once
    event_list = self._selector.select(timeout)
  File "/usr/lib/python3.9/selectors.py", line 469, in select
    fd_event_list = self._selector.poll(timeout, max_ev)
KeyboardInterrupt
Exception ignored in: <coroutine object download_all_sites at 0x7fc348b856c0>
RuntimeError: coroutine ignored GeneratorExit
Task was destroyed but it is pending!
task: <Task pending name='Task-609' coro=<download_site() running at /home/takamura/Documents/corp/scripts/misc_scripts/links_checker.py:41> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x7fc348101520>()]> cb=[gather.<locals>._done_callback() at /usr/lib/python3.9/asyncio/tasks.py:766]>

我究竟做错了什么 ??


解决方案


暂无回答



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/1747448/80b9b56fe366e58b9b8c/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

28 0
收藏该文
已收藏

评论内容:(最多支持255个字符)