使用异步和线程

2023-12-12

在同一个 python 项目中同时使用 asyncio 和线程是否有意义,以便代码在不同的线程中运行,其中一些 asyncio 用于获取异步活动的顺序查找代码?

或者尝试这样做是否意味着我缺少一些有关使用线程或异步的基本概念?


我不明白你在问什么(关于“顺序查找异步活动的代码”的部分),但由于没有答案,我会写一些想法。

让我们谈谈为什么我们需要 asyncio/threads。想象一下我们有一个任务要提出两个请求。

  1. 如果我们使用普通的单线程非异步代码,这是我们唯一的选择 是仅在完成后才对一个 url 发出请求 - for 其他:

    request(url1)
    request(url2)
    

    这里的问题是我们的工作效率低下:每个函数在执行的大部分时间里什么也不做,只是等待网络结果。如果我们能够以某种方式使用 CPU 来处理第二个请求,而第一个请求则陷入网络问题并且不需要它,那就太酷了。

  2. 这个问题可以通过在不同线程中运行函数来解决(并且通常可以解决):

    with ThreadPoolExecutor(max_workers=2) as e:
        e.submit(request, url1)
        e.submit(request, url2)
    

    这样我们就能更快地得到结果。当第一个请求被网络卡住时,CPU 将能够在另一个线程中为第二个请求做一些有用的事情。

    然而,这不是理想的解决方案:线程之间的切换有一些成本,执行流程比第一个示例更复杂。

    应该还有更好的办法。

  3. 使用一个函数的空闲时间来开始执行另一个函数是 asyncio 的一般含义:

    await asyncio.gather(
        async_request(url1),
        async_request(url2),
    )
    

    事件循环管理执行流程:当第一个协程完成某些 I/O 操作并且 CPU 可用于在其他地方执行工作时,第二个协程启动。稍后事件循环返回以继续执行第一个协程。

    我们得到“并行”请求和干净易懂的代码。由于我们在单线程中实现了并行化,因此我们不需要另一个线程。

实际上,当我们使用 asyncio 线程时仍然很有用。如果我们准备好付钱给他们,他们就可以help我们可以非常快速地将同步 I/O 函数转换为异步函数:

async def async_request(url):
    loop = asyncio.get_event_loop()
    return (await loop.run_in_executor(None, request, url))

但同样,它是可选的,我们通常可以找到模块来异步发出请求(和其他 I/O 任务),而无需线程。

当线程在异步程序中有用时,我没有面临任何其他任务。

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

使用异步和线程 的相关文章

  • 循环列表的值[重复]

    这个问题在这里已经有答案了 我是编码新手 正在尝试编写一个简单的代码 该代码将采用一个列表 例如 1 2 3 并循环元素 n 次 所以如果n 1 我应该得到A 3 1 2 如果n 2 我应该得到A 2 3 1 我写的代码是 n 1 j 0
  • 有没有办法使用纯Python释放纯函数的GIL?

    我想我一定错过了什么 这看起来很正确 但我看不出有什么办法可以做到这一点 假设你有一个 Python 纯函数 from math import sin cos def f t x 16 sin t 3 y 13 cos t 5 cos 2
  • 无法使用 beautifulsoup 模块 python 从 HTML 检索温度值

    我正在使用 BeautifulSoup4 来解析此 HTML 查看源代码 https weather com en IN weather today l 17 39 78 49 https weather com en IN weather
  • Python3如何安装.ttf字体文件?

    我想使用 python3 更精确的 Python 3 6 代码在 Windows 10 上安装 ttf 字体文件 我用谷歌搜索 但我发现的唯一的就是这个使用python在windows上安装TTF字体 https stackoverflow
  • 如何在Python中获取声音级别?

    对于我正在进行的项目 我需要获取麦克风的实时分贝级别 我见过阴谋家 Print out realtime audio volume as ascii bars import sounddevice as sd import numpy as
  • 无法使用 BeautifulSoup4 (Python 3) 抓取特定表

    我想从 Ligue 1 足球网站上抓取一张表格 具体来说 该表包含有关卡片和裁判的信息 http www ligue1 com LFPStats stats arbitre competition D1 http www ligue1 co
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • ipython/ pylab/ matplotlib安装和初始化错误

    我在 OS X El Captain 上安装了 matplotlib anaconda ipython 然而 即使在尝试以所有可能的方式设置环境变量之后 我仍无法启动 ipython shell pylab 版本 这是错误 ImportEr
  • Windows 操作系统中 ST_INO(os.stat() 输出)的含义

    谁能告诉我这个值的含义是什么st ino是跑步时os stat 在 Windows 上 Python 3 5 3 在早期的 Python 版本中 它包含虚拟值 但最近发生了变化 我找不到它是如何计算 生成的 我怀疑它因文件系统 NTFS F
  • While 在范围内循环用户输入

    我有一些代码 我想要求用户输入 1 100 之间的数字 如果他们在这些数字之间输入一个数字 它将打印 Size input 并打破循环 但是 如果他们在外部输入一个数字1 100 它将打印 大小 输入 并继续向他们重新询问一个数字 但我遇到
  • 在 pywin32 中创建一个新的 Excel 文件

    我正在编写一个程序 概括来说 采用记事本文件并将其另存为 Excel 文件 现在我的程序打开一个我创建的空白 Excel 文件 只是 Book1 xls xlApp Dispatch Excel Application xlApp Visi
  • 哪种方式最适合Python工厂注册?

    这是一个关于这些方法中哪一种被认为是最有效的问题 Pythonic 我不是在寻找个人意见 而是在寻找惯用的观点 我的背景不是Python 所以这会对我有帮助 我正在开发一个可扩展的 Python 3 项目 这个想法类似于工厂模式 只不过它是
  • 检查 IP 地址是否在给定范围内

    我想检查一下是否有IP180 179 77 11位于特定范围之间 例如180 179 0 0 180 179 255 255 我编写了一个函数 它将每个 IP 八位字节与其他八位字节进行比较 def match mask IP min ip
  • 如何同时使用不和谐机器人命令和事件?

    我需要制作一个机器人来监听服务器中写入的消息 同时接受命令 Create the Discord client client discord Client client commands Bot command prefix client
  • Seed_data.yaml 文件中有没有办法自动生成第一个模型所依赖的模型?

    我正在使用 Django 2 0 Python 3 7 和 MySql 5 我有以下两个模型 第二个依赖于第一个 class CoopType models Model name models CharField max length 20
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • 嵌套列表的重叠会产生不必要的间隙

    我有一个包含三个列表的嵌套 这些列表由 for 循环填充 并且填充由 if 条件控制 第一次迭代后 它可能类似于以下示例 a 1 2 0 0 0 0 0 0 4 5 0 0 0 0 0 0 6 7 根据条件 它们不重叠 在第二次迭代之后 新
  • 无效的选择器:使用 Selenium 时不允许出现复合类名错误

    我正在尝试通过 Web Whatsapp 打印聊天中的一条消息 我可以通过 控制台 选项卡中的 Javascript 来完成此操作 我就是这样做的 recived msg document getElementsByClassName XE
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是

随机推荐

  • 有没有办法分析 Chromecast 崩溃?

    显然 崩溃后 端口 9222 上的开发者工具没有任何用处 因为 远程调试已因原因终止 websocket close 例如 我如何检索记录的时间线 或获取调用堆栈 或者找到有关 Chromecast 决定自行重启的原因的任何信息 调试 Ch
  • 在 JS 中移动元素

    我正在学习 javascript 并尝试做一个简单的练习 我有一个文本框并想用键盘控制它 我的 HTML 如下 目前 我只是尝试 1 个方向 const myBox document querySelector h1 document ad
  • D3 节点半径取决于链接数量:权重属性

    我正在尝试使用 D3 创建力定向图 就目前而言 节点的半径取决于核心价值JSON 中的对 d 尺寸 我知道d3 权重属性可用于计算链接数量并关联圆的半径属性 但我不知何故无法让它工作 请在这件事上给予我帮助 找到下面的代码 d3 json
  • “合并”替换 Keras/Tensorflow/Python3

    Merge 未在 Keras Tensorflow Python3 版本上运行 在以前的版本中 合并正在运行 但现在 它没有运行 所以我想我应该用替换 合并 来转换此代码 新的 Keras Tensorflow Python3 版本中缺少
  • 给定一个数组,找出每个元素的下一个较小元素

    给定一个数组 在不改变元素原始顺序的情况下 为每个元素找到数组中下一个较小的元素 例如 假设给定数组为 4 2 1 5 3 结果数组将为 2 1 1 3 1 我在一次采访中被问到这个问题 但我想不出比简单的 O n 2 解决方案更好的解决方
  • SQLite是否支持“删除自”

    这是 Microsoft SQL Server 的 T SQL 上的有效语法 但在 SQLite 中无效 是否有在 SQLite 中执行相同操作的替代语法 DELETE FROM something FROM something INNER
  • HTML元素的id属性在整个页面中必须是唯一的吗?

    我正在使用 jQuery 我只是想知道 ID 在整个页面中是否必须始终是唯一的 我知道课程可以重复多次 那么 ID 呢 是的 它必须是独一无二的 HTML4 https www w3 org TR html4 struct global h
  • 如果循环正在运行,wifi.sta 模块会连接吗?

    我试图检测模块何时实际连接到我的 wifi AP 因为 connect 没有回调 我做了如下简单的事情 wifi sta config SSID password wifi sta connect tmr delay 1000000 i 0
  • 在 es6 中添加行而不推送反应状态

    我不确定我做的是正确的事情 我在 setState 之外改变变量 这很好 对吧 或者有更优雅的方法来做到这一点 state persons name jay age 10 addRow gt const temp this state te
  • 对 asp-route-parameter 使用隐藏字段值

    我在 PartialView 中有一个隐藏字段 其中包含我想要的值 jQuery 填充它 我需要在 foreach asp route parameter 中使用相同的值 div class js products list div
  • 通过Id查询Morphia

    我正在使用 Morphia MongoDB 的 Pojo 映射器 我发现一项在我看来应该非常简单的任务很困难 通过 id 获取对象 我能够找到集合中的所有对象 但无法弄清楚使用从列表中获得的 id 进行查询的简单任务 我实际上是在谈论 Ob
  • 如何保护PHP中的配置文件?

    我正在开发一个 PHP 项目 为其他程序员开发模板引擎 这个想法很简单 将有一个包含模板的模板文件夹和一个包含页面的页面文件夹 php 获取模板并使用当前 url 将页面插入其中 几年前我在没有面向对象的情况下完成了这个项目 但现在我正在尝
  • InvalidOperationException:类型“System.Linq.Queryable”上的方法“Where”与提供的参数不兼容

    下面的代码已更新并且可以正常工作 LinqPad 有动态 OrderBy 示例 我想做的只是简单地对此示例应用 Where 而不是 OrderBy 这是我的代码 IQueryable query from p in Purchases wh
  • 将 csv 文件读入结构数组

    我开始用C编写代码 我的代码如下 include
  • 在 Google 地图之外保存地图实例

    我制作了一个谷歌地图 API HTML 脚本 当用户单击地图时 它会创建标记 我还集成了 Google 登录功能 因此用户是独一无二的并且拥有个人资料 我现在想要做到这一点 以便用户可以在他们想要的位置上创建标记 然后保存地图 以便他们稍后
  • 如何从用户输入中收集信息并将其应用到其他地方

    您好 我是编程新手 我正在尝试编写一个代码来从输入中收集信息并确定它是否是有效的字母表 这是我到目前为止的代码 words word input Character while word if word not in words words
  • TensorFlow 静态 C API 库 - 如何链接 10 个子依赖项?

    我正在尝试链接 TensorFlow 库的静态 C API 版本 我使用以下命令构建了静态库 get the sources git clone https github com tensorflow tensorflow git tens
  • Java 值对集合? (元组?)

    我喜欢 Java 的 Map 您可以在其中定义映射中每个条目的类型 例如
  • awk 范围和文本选择

    我知道如何在 awk 中使用范围运算符 awk start stop file 是否可以选择范围运算符内的文本 ATM 我正在使用 if 语句 awk start stop if 1 foo file 有没有更理想的方法来做到这一点 切勿使
  • 使用异步和线程

    在同一个 python 项目中同时使用 asyncio 和线程是否有意义 以便代码在不同的线程中运行 其中一些 asyncio 用于获取异步活动的顺序查找代码 或者尝试这样做是否意味着我缺少一些有关使用线程或异步的基本概念 我不明白你在问什