Python asyncio 不显示任何错误

2023-11-24

我正在尝试使用 asyncio 从数千个网址中获取一些数据。 以下是设计的简要概述:

  1. 填写一个Queue使用一个单一的一次性处理一堆网址Producer
  2. 产生一堆Consumers
  3. Each Consumer保持异步地从 中提取 urlQueue并发送GET要求
  4. 对结果进行一些后处理
  5. 合并所有处理结果并返回

问题: asyncio几乎从不显示是否有任何问题,它只是静静地挂起,没有错误。我放print到处声明自己发现问题,但没有多大帮助。

根据输入网址的数量以及消费者或限制的数量,我可能会收到以下错误:

  1. Task was destroyed but it is pending!
  2. task exception was never retrieved future: <Task finished coro=<consumer()
  3. aiohttp.client_exceptions.ServerDisconnectedError
  4. aiohttp.client_exceptions.ClientOSError: [WinError 10053] An established connection was aborted by the software in your host machine

问题:如何检测和处理异常asyncio?如何在不中断的情况下重试Queue ?

下面是我编译的代码,查看了异步代码的各种示例。目前,在结尾处存在故意错误def get_video_title功能。运行时,什么也没有显示。

import asyncio
import aiohttp
import json
import re
import nest_asyncio
nest_asyncio.apply() # jupyter notebook throws errors without this


user_agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"

def get_video_title(data):
    match = re.search(r'window\[["\']ytInitialPlayerResponse["\']\]\s*=\s*(.*)', data)
    string = match[1].strip()[:-1]
    result = json.loads(string)
    return result['videoDetails']['TEST_ERROR'] # <---- should be 'title'

async def fetch(session, url, c):
    async with session.get(url, headers={"user-agent": user_agent}, raise_for_status=True, timeout=60) as r:
        print('---------Fetching', c)
        if r.status != 200:
            r.raise_for_status()
        return await r.text()

async def consumer(queue, session, responses):
    while True:
        try:
            i, url = await queue.get()
            print("Fetching from a queue", i)
            html_page = await fetch(session, url, i)

            print('+++Processing', i)
            result = get_video_title(html_page) # should raise an error here!
            responses.append(result)
            queue.task_done()

            print('+++Task Done', i)

        except (aiohttp.http_exceptions.HttpProcessingError, asyncio.TimeoutError) as e:
            print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Error', i, type(e))
            await asyncio.sleep(1)
            queue.task_done()

async def produce(queue, urls):
    for i, url in enumerate(urls):
        print('Putting in a queue', i)
        await queue.put((i, url))

async def run(session, urls, consumer_num):
    queue, responses = asyncio.Queue(maxsize=2000), []

    print('[Making Consumers]')
    consumers = [asyncio.ensure_future(
        consumer(queue, session, responses)) 
                 for _ in range(consumer_num)]

    print('[Making Producer]')
    producer = await produce(queue=queue, urls=urls)

    print('[Joining queue]')
    await queue.join()

    print('[Cancelling]')
    for consumer_future in consumers:
        consumer_future.cancel()

    print('[Returning results]')
    return responses

async def main(loop, urls):
    print('Starting a Session')
    async with aiohttp.ClientSession(loop=loop, connector=aiohttp.TCPConnector(limit=300)) as session:
        print('Calling main function')
        posts = await run(session, urls, 100)
        print('Done')
        return posts


if __name__ == '__main__':
    urls = ['https://www.youtube.com/watch?v=dNQs_Bef_V8'] * 100
    loop = asyncio.get_event_loop()
    results = loop.run_until_complete(main(loop, urls))

问题是你的consumer仅捕获两个非常具体的异常,并在它们的情况下将任务标记为已完成。如果发生任何其他异常,例如与网络相关的异常,它将终止消费者。然而,这并没有被检测到run,正在等待queue.join()消费者(有效地)在后台运行。这就是您的程序挂起的原因 - 排队的项目永远不会被考虑,并且队列永远不会被完全处理。

有两种方法可以解决此问题,具体取决于您希望程序在遇到意外异常时执行的操作。如果你想让它继续运行,你可以添加一个包罗万象的except给消费者的条款,例如:

        except Exception as e
            print('other error', e)
            queue.task_done()

另一种选择是未处理的要传播到的消费者异常run。这必须显式安排,但具有永远不允许异常静默通过的优点。 (看本文以获得该主题的详细处理。)实现它的一种方法是等待queue.join()同时也是消费者;由于消费者处于无限循环中,因此只有在发生异常时才会完成。

    print('[Joining queue]')
    # wait for either `queue.join()` to complete or a consumer to raise
    done, _ = await asyncio.wait([queue.join(), *consumers],
                                 return_when=asyncio.FIRST_COMPLETED)
    consumers_raised = set(done) & set(consumers)
    if consumers_raised:
        await consumers_raised.pop()  # propagate the exception

问题:如何检测和处理asyncio中的异常?

异常通过以下方式传播await通常会像其他代码一样进行检测和处理。仅需要特殊处理来捕获从“后台”任务泄漏的异常,例如consumer.

如何在不中断队列的情况下重试?

您可以致电await queue.put((i, url)) in the except堵塞。该项目将被添加到队列的后面,由消费者拾取。在这种情况下,您只需要第一个片段,并且不想费心尝试在中传播异常consumer to run.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python asyncio 不显示任何错误 的相关文章

  • 按每个元素中出现的数字对字符串列表进行排序[重复]

    这个问题在这里已经有答案了 我有一个脚本 其目的是对不断下载到服务器上的空间数据集文件进行排序和处理 我的列表目前大致如下 list file t00Z wrff02 grib2 file t00Z wrff03 grib2 file t0
  • 学习Python中的解析器

    我记得我读过有关解析器的内容 您只需提供一些示例行 它就知道如何解析某些文本 它只是确定两条线之间的差异 以了解可变部分是什么 我以为它是用 python 写的 但我不确定 有谁知道那是什么图书馆吗 可能你的意思是模板制作器 http co
  • virtualenvwrapper 函数在 shell 脚本中不可用

    所以 我再一次制作了一个很棒的 python 程序 它让我的生活变得更加轻松 并节省了大量时间 当然 这涉及到一个 virtualenv 用mkvirtualenvvirtualenvwrapper 的功能 该项目有一个requiremen
  • 创建 xyz 海拔数据的曲面图

    我正在尝试用 python 创建一座山的表面图 其中我有一些 xyz 数据 最终结果应该类似于that https i stack imgur com rKQV0 png 该文件的格式如下 616000 0 90500 0 3096 712
  • 如何在Python + Selenium中获取元素的值

    我在我的 Python 3 6 3 代码中得到了这个 HTML 元素 作为 Selenium网页元素当然 span class ocenaCzastkowa masterTooltip style color 000000 alt 5 sp
  • DataFrame.loc 的“索引器太多”

    我读了关于切片器的文档 http pandas pydata org pandas docs stable advanced html using slicers一百万次 但我从来没有理解过它 所以我仍在试图弄清楚如何使用loc切片Data
  • lmfit模型拟合然后预测

    我正在领养lmfit进行曲线拟合并使用拟合模型进行预测 然而下面的代码并没有达到我想要的效果 能否请你帮忙 谢谢 import numpy as np from lmfit import Model def linearModel x a0
  • Asyncio:从未检索到任务异常的怪异

    假设我有一个简单的代码 import asyncio async def exc print 1 0 loop asyncio get event loop loop create task exc try loop run forever
  • Python 中“is”运算符的语义是什么?

    如何is运算符确定两个对象是否相同 它是如何工作的 我找不到它的记录 来自文档 http docs python org reference datamodel html 每个对象都有一个身份 一个类型 和一个值 对象的身份 一旦发生就永远
  • 提高光线追踪命中功能的性能

    我有一个简单的 python 光线追踪器 渲染 200x200 的图像需要 4 分钟 这对于我的口味来说绝对是太多了 我想改善这种情况 几点 我为每个像素发射多条光线 以提供抗锯齿功能 每个像素总共发射 16 条光线 200x200x16
  • Pygame:有人可以帮我实现双跳吗?

    我知道已经有其他关于此问题的帖子了 但我的运动系统与我发现的有点不同 所以随后我问这个问题 我的运动系统基于一个名为的命名元组Move up left right down 然后就是这个 def update self move block
  • Kivy TextInput 水平和垂直对齐(文本居中)

    如何在 Kivy 的 TextInput 中水平居中文本 I have the following screen But I want to centralize my text like this 这是我的 kv 语言的一部分 BoxLa
  • 使用具有可变数量索引的 numpy mggrid

    如何将 numpy mgrid 与可变数量的索引一起使用 我在 github 上找不到任何人将其与硬编码值以外的任何内容一起使用的示例 import numpy as np np mgrid 1 10 1 10 this works fin
  • 将 str.contains 映射到 pandas DataFrame

    python 初学者 我正在寻找创建字符串的字典映射以及关联的值 我有一个数据框 想要创建一个新列 如果字符串匹配 则会将该列标记为 x df pd DataFrame comp dell notebook dell notebook S3
  • 如何在类型提示中定义元组或列表的大小

    有没有办法在参数的类型提示中定义元组或列表的大小 目前我正在使用这样的东西 from typing import List Optional Tuple def function name self list1 List Class1 if
  • 本地主机上的 Google App Engine GQL 查询

    我正在 Google App Engine Windows 上的 SDK 版本 1 7 0 上开发一个应用程序 我需要经常测试该应用程序 并且此测试涉及数据存储上的大量 GQL 查询 您可以在 App Engine 管理界面的浏览器中在线运
  • 带 Qt 的菜单栏/系统托盘应用程序

    我是 Qt PyQt 的新手 我正在尝试制作一个应用程序 其功能将从菜单栏 系统托盘执行 这里展示了一个完美的例子 我找不到关于如何做到这一点的好资源 有人可以建议吗 Thanks 我认为您正在寻找与QMenu and QMainWindo
  • 尝试 numba 时出现巨大错误

    我在使用 numba 时遇到了大量错误 讽刺的是 正确的结果是在错误之后打印的 我正在使用最新的 Anaconda python 并安装了 numba conda install numba 一次在 Ubuntu 13 64 位和 anac
  • JSONDecodeError:额外数据:Python [重复]

    这个问题在这里已经有答案了 我使用以下代码从文件加载 json file file name obj list with open file as f for json obj in f obj list append loads json
  • 美丽的汤刮 - 登录凭据不起作用

    尝试使用登录凭据抓取页面 payload email gmail com password urls login url https www spotrac com signin url https www spotrac com nba

随机推荐

  • Gnu-Screen:运行脚本,将命令发送到正在运行的屏幕会话

    是否可以编写一个脚本来更改名称并打开对当前选项卡的监视 假设它正在屏幕中运行 Thanks 从屏幕手册页 X Send the specified command to a running screen session You can us
  • 所有对最大流量

    给定一个有向加权图 如何找到最大流量 or 最小切边 在所有顶点对之间 天真的方法就是简单地调用Max Flow像 Dinic 的算法 其复杂度为O V 2 E 对于每对 因此对于所有对来说都是O V 4 E 是否可以将复杂度降低到O V
  • 如何从 .env 文件设置环境变量

    假设我有 env 文件包含如下行 USERNAME ABC PASSWORD PASS 与正常人不同的是export前缀 所以我无法直接获取文件 创建从 env 文件加载内容并将其设置为环境变量的 shell 脚本的最简单方法是什么 如果您
  • R (purrr) 展平命名列表以列出并保留名称

    也许我遗漏了一些明显的东西 但试图将 R 中的命名列表的命名列表 甚至可能更加嵌套 扁平化为最终一个平面列表 purrr and rlist似乎有这方面的工具 我怎样才能实现子列表的名称成为扁平化结果列表的名称预加密 例如list1 bli
  • 在主对话框中嵌入对话框并通过 MFC 中的按钮单击进行切换

    我有一个如下的设计 所以基本上 我想在应用程序主对话框中嵌入三个对话框并在它们之间切换 对于每个按钮单击 即按钮 1 将显示对话框 1 按钮 2 将隐藏对话框 1 并显示对话框 2 等等 每个对话框都有不同的设计和功能 我尝试使用 CPro
  • 为什么 std::regex_iterator 会导致此数据堆栈溢出?

    我一直在使用std regex iterator解析日志文件 我的程序已经工作了好几个星期 并且已经解析了数百万条日志行 直到今天 当今天我对日志文件运行它并得到堆栈溢出时 事实证明 只有日志文件中的一个日志行导致了问题 有谁知道为什么我的
  • 自从最近引入登录审核以来,我如何测试 Facebook 应用程序?

    我正在开发一个 Facebook 应用程序 它通过 API 调用来获取用户事件列表 该应用程序将使用 Javascript 来调用用户 事件边缘 如下所示 FB api user id events function response if
  • Powershell 中加号 (+) 的特殊使用

    除了其自然用法 即两个参数相加 之外 您还可以使用加号 登录 Powershell 进行特殊调用 如下所示 System Net WebRequestMethods Ftp UploadFile UploadFile是一个公共静态字段 根据
  • C#:以编程方式在工作表范围内创建“命名范围”

    我们如何创建一个 命名范围 其范围设置为工作表 因为我们可以从 Excel 手动执行此操作 所以我想有一种方法可以在代码中执行此操作 使用 设置名称Range Name 属性创建一个工作簿范围的命名范围 我尝试在范围名称前添加 前缀按照建议
  • 在 pandas MultiIndex DataFrame 中选择行

    选择 过滤行的最常见的 pandas 方法是什么索引为 MultiIndex 的数据帧 基于单个值 标签的切片 基于来自一个或多个级别的多个标签进行切片 过滤布尔条件和表达式 哪些方法适用于哪些情况 为简单起见假设 输入数据帧没有重复的索引
  • 在 Microsoft Edge 中使用 @font-face

    我在这里处理一个奇怪的问题 当我使用 font face 时 Microsoft Edge 浏览器似乎不加载字体 我检查了所有运行 Windows 10 和 Microsoft Edge 的计算机 我检查了http caniuse com
  • 核心数据 - 在 Group By 中使用瞬态属性

    我正在创建一个带有一些聚合数据的 UITableView 在此过程中 需要使用节标题对表视图单元格进行排序和分组 问题是我想在 NSFetchRequest 中使用瞬态属性来生成节标题和结果排序 问题是 在设置 NSFetchRequest
  • phoneGap Cordova 中的命令行失败,退出代码为 8

    我正在尝试从phonegap 和cordova 开始 我按照以下步骤http phonegap com install 但在命令下 phonegap run android在命令提示符下我收到以下错误 Command line failed
  • Fancy Box - 关闭 iframe 弹出窗口时如何刷新父页面?

    我希望当我关闭 Fancy Box 弹出框架时刷新我的父页面 我在弹出窗口中有一个登录页面 因此我需要刷新父页面以在 Fancy Box 关闭时显示新的登录状态 我可以让它在没有 iFrame 代码的情况下工作 但我无法让它与 iFra
  • 获取列名的 LINQ 成员表达式

    Hello 我正在将 LINQ 和 EF 与 C 4 0 一起使用 我已将基本的 ELMAH 表拖入 EF 多次构建和保存 一切都如人们所期望的那样进行 但尝试过于雄心勃勃 需要一点帮助 我试图从作为变量传入的表达式中获取列名称 我想要的是
  • 如何查找Java + JNI + C++进程中的内存泄漏

    我有一个用 java 编写的项目 使用 JNI 使用 C 库 所有的代码都是我们写的 所以我有所有的源代码 几个小时后 机器内存不足 尽管我的进程只是迭代文件 并且删除了与前一个文件相关的所有内存 我确信存在内存泄漏 通常我使用Valgri
  • 用于搜索专利数据库(即 USPTO 或 EPO)的 Python 模块

    对于我的工作 我必须寻找生物医学研究和工业领域的潜在客户 我使用模块 biopython 编写了一些非常方便的程序 它有一个很好的用于搜索 NCBI 的界面 我还使用了 Clinical Trials 模块来搜索 ClinicalTrial
  • 如何使用 JSDoc3 记录嵌套命名空间

    我在使用 JSDoc3 记录按照这些方式构建的代码时遇到问题 namespace MyNamespace MySubNamespace function MyNamespace MyNamespace MySubNamespace Foo
  • R 中发现的任何错误都会响应 Error in app$vspace(new_style$`margin-top` %||% 0) : attempts to apply non-function

    老实说 我不知道如何使其可重现 使用 tidyverse 在 R 中发生的任何错误都会抛出 Error in app vspace new style margin top 0 attempt to apply non function 还
  • Python asyncio 不显示任何错误

    我正在尝试使用 asyncio 从数千个网址中获取一些数据 以下是设计的简要概述 填写一个Queue使用一个单一的一次性处理一堆网址Producer 产生一堆Consumers Each Consumer保持异步地从 中提取 urlQueu