Python 异步任务和 CPU 密集型任务?

2024-03-25

我最近一直在使用 Flask 在 python 中开发一个宠物项目。它是一个简单的 Pastebin,具有服务器端语法突出显示 pygments 的支持。因为这是一项成本高昂的任务,所以我将语法突出显示委托给了 celery 任务队列,并在请求处理程序中等待它完成。不用说,这只会减轻另一个工作人员的 CPU 使用率,因为等待结果仍然会锁定与网络服务器的连接。 尽管我的直觉告诉我要像瘟疫一样避免过早的优化,但我仍然无法控制自己去研究异步。

Async

如果最近一直在关注 python Web 开发,你肯定已经看到异步无处不在。异步所做的是恢复协作式多任务处理,这意味着每个“线程”决定何时何地让位于另一个线程。这种非抢占式进程比操作系统线程更有效,但仍然有其缺点。目前似乎有两种主要方法:

  • 事件/回调风格的多任务处理
  • 协程

第一个通过在事件循环中执行的松散耦合组件提供并发性。尽管这在竞争条件方面更安全并且提供了更高的一致性,但与抢占式多任务处理相比,它相当不直观且更难编码。

另一种是更传统的解决方案,更接近线程编程风格,程序员只需手动切换上下文。尽管更容易出现竞争条件和死锁,但它提供了一种简单的嵌入式解决方案。

目前大多数异步工作都是在所谓的IO-bound任务,阻塞等待输入或输出的任务。这通常是通过使用可以调用的基于轮询和超时的函数来完成的,如果它们返回负值,则可以切换上下文。

尽管有这个名字,但这可以应用于CPU 限制任务也是如此,可以将其委托给另一个工作人员(线程、进程等),然后非阻塞地等待屈服。理想情况下,这些任务将以异步友好的方式编写,但实际上这意味着将代码分成足够小的块而不会阻塞,最好不要在每行代码之后分散上下文切换。这对于现有的同步库来说尤其不方便。


由于方便,我决定使用 gevent 进行异步工作,并想知道如何在异步环境中处理 CPU 密集型任务(使用 futures、celery 等?)。

如何将异步执行模型(本例中为 gevent)与传统 Web 框架(例如 Flask)一起使用? python 中这些问题的一些普遍商定的解决方案(期货、任务队列)是什么?

EDIT:更具体地说 - 如何在 Flask 中使用 gevent 以及如何在这种情况下处理 CPU 密集型任务?

EDIT2:考虑到 Python 的 GIL 会阻止线程代码的最佳执行,因此至少在我的例子中,只剩下多处理选项。这意味着要么使用并发期货或其他一些处理处理的外部服务(甚至可以为与语言无关的东西打开大门)。在这种情况下,gevent 的一些流行或常用解决方案是什么(i.e.芹菜)? - 最佳实践


执行如下操作将 cpu 密集型任务分离到异步线程中应该是线程安全的:

from threading import Thread

def send_async_email(msg):
    mail.send(msg)

def send_email(subject, sender, recipients, text_body, html_body):
    msg = Message(subject, sender = sender, recipients = recipients)
    msg.body = text_body
    msg.html = html_body
    thr = Thread(target = send_async_email, args = [msg])
    thr.start()

如果您需要更复杂的东西,那么 Flask-Celery 或带有“Pool”的多处理库可能对您有用。

我对 gevent 不太熟悉,但我无法想象您可能需要什么更多的复杂性或原因。

我的意思是,如果您尝试获得主要世界网站的效率,那么我建议您构建 C++ 应用程序来完成 CPU 密集型工作,然后使用 Flask-celery 或 Pool 来运行该进程。 (这就是 YouTube 在混合 C++ 和 Python 时所做的事情)

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

Python 异步任务和 CPU 密集型任务? 的相关文章

  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • 为 pandas 数据透视表中的每个值列定义 aggfunc

    试图生成具有多个 值 列的数据透视表 我知道我可以使用 aggfunc 按照我想要的方式聚合值 但是如果我不想对两列求和或求平均值 而是想要一列的总和 同时求另一列的平均值 该怎么办 那么使用 pandas 可以做到这一点吗 df pd D
  • 如何使用装饰器禁用某些功能的中间件?

    我想模仿的行为csrf exempt see here https docs djangoproject com en 1 11 ref csrf django views decorators csrf csrf exempt and h
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • Abaqus 将曲面转化为集合

    我一直试图在模型中找到两个表面的中心 参见照片 但未能成功 它们是元素表面 面 查询中没有选项可以查找元素表面的中心 只能查找元素集的中心 找到节点集的中心也很好 但是我的节点集没有出现在工具 gt 查询 gt 质量属性选项中 而且我找不到
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • 使用 OpenPyXL 迭代工作表和单元格,并使用包含的字符串更新单元格[重复]

    这个问题在这里已经有答案了 我想使用 OpenPyXL 来搜索工作簿 但我遇到了一些问题 希望有人可以帮助解决 以下是一些障碍 待办事项 我的工作表和单元格数量未知 我想搜索工作簿并将工作表名称放入数组中 我想循环遍历每个数组项并搜索包含特
  • Node.js 中的异步或步骤

    我无法让我的异步代码与 node js 一起使用 尝试异步和步骤库 代码仅返回第一个函数 似乎没有执行其余函数 我究竟做错了什么 thanks var step require step step function f1 console l
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 对输入求 Keras 模型的导数返回全零

    所以我有一个 Keras 模型 我想将模型的梯度应用于其输入 这就是我所做的 import tensorflow as tf from keras models import Sequential from keras layers imp
  • 协方差矩阵的对角元素不是 1 pandas/numpy

    我有以下数据框 A B 0 1 5 1 2 6 2 3 7 3 4 8 我想计算协方差 a df iloc 0 values b df iloc 1 values 使用 numpy 作为 cov numpy cov a b I get ar
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject

随机推荐

  • 自动增量已自动重置回 1

    我刚刚遇到了一个我无法解决的问题 我有一个数据库表project queues它用作队列 我在其中存储一些记录 处理记录后 它们将被删除 删除是由 Rails 构造调用的record destroy在触发的循环中DELETE record
  • WPF:绑定到类内的列表

    我有一个文件类定义如下 public class File public string FileName set get public List
  • 如何在世博会上运行“@apollo/client”

    我有一个裸露的反应本机 然后我将项目转换为expo项目 因为该项目没有与主 React Native 项目一起运行 所以在创建 expo 项目后 我尝试运行该项目 但它给了我这个错误 While trying to resolve modu
  • 在 Fortran 95 中按值传递参数

    如何在调用函数参数时保留其值而不创建新变量 这就是 如何按值传递参数 在此示例代码中 program what implicit none integer a b c d a 1 b 2 c 3 print a b c d f val a
  • varchar 和 int mysql 数据类型的默认值

    屏幕截图显示了数据类型的 3 个典型定义 id 自动增量 标题和数字 1 之间有哪些区别 none and NULL 2 我必须选择吗as defined 当我想要一个空字符串时 对于 varchar 类型 3 我必须放一个as defin
  • 我什么时候应该使用 Response.Redirect(url, true)?

    我正在重定向到一个错误页面 其中包含一条经过美化的错误消息Application Error 在 Global asax 中 目前它说 Response Redirect Error aspx true 应该是 Response Redir
  • MongoDB:cursor.toArray 返回 Promise { }

    情况 我写了一个查询 var results db collection diseases find ttl txt regex data options i toArray Problem 然后我打印了results到控制台 if res
  • VBA 中运行时错误 429,但类已注册

    我正在尝试重新创建一个程序 该程序使用 JavaScript 打开与 PLC 的连接 然后在网页上显示各种信息 由于各种原因 我宁愿将其以 MS Access 的形式保存 并且一直在努力寻找合适的 dll 来使用 Jet32X dll 如果
  • Chrome 中的 HTML5 视频边框半径不起作用

    我试图让我的 HTML5 视频具有透明的左上角和左下角圆角 就像使用 border radius 时的行为一样 不幸的是 在 Chrome 中 由于某种原因 border radius 在 HTML 视频标签上不起作用 但在 IE10 和
  • numpy stride_tricks.as_strided 与滚动窗口的列表理解

    在处理滚动窗口时 我以列表理解的方式编写函数 np std x i i framesize for i in range 0 len x framesize hopsize 最近我发现numpy lib stride tricks as s
  • bash 重命名带有空格的文件时出错 - mv 目标不是目录

    我正在尝试重命名一堆包含空格的文件 去掉空格 我以为我找到了正确的 bash 命令 for f in txt do mv f f done 但是 这会给每个文件带来错误 mv 目标不是目录 如果我在命令中将 mv 替换为 echo mv 它
  • 确定PDF文件中的页数[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要使用 C 代码 NET 2 0 确定指定 PDF 文件的页数 PDF 文件将从文件系统读取 而不是从 URL 读取 有谁知道如何
  • 如何在 Javascript 中格式化时间戳以将其显示在图表中? UTC 没问题

    基本上 我收到原始时间戳 需要将它们格式化为 HH MM SS 格式 这是一个提供灵活的 UTC 日期格式的函数 它接受类似于 Java 的 SimpleDateFormat 的格式字符串 function formatDate date
  • Rails:如何在搜索结果中使用构面

    我有一个铁路应用程序 我正在其中搜索维修店 搜索类方法如下所示 def self search params if params repairshop Repairshop where approved gt true if params
  • 通用 ELF 中的重定位(EM:40)

    我尝试从 Ubuntu 交叉编译到Friendly arm 但出现了奇怪的错误 root kevin VirtualBox home kevin Desktop makef make ARCH arm CROSS COMPILE arm n
  • 无法调用按钮命令:应用程序已被破坏

    下面给出了使用 Tkinter 和 Python 创建独立窗口的代码 import Tkinter Tkinter NoDefaultRoot win1 Tkinter Tk win2 Tkinter Tk Tkinter Button w
  • 连接远程redis服务器

    我想对 redis conf 进行一些更改 以便每当我输入 redis cli 时 它都会将我连接到远程服务器上安装的 redis 我知道我们可以通过以下方式连接到安装在远程服务器上的redis redis cli h IP Address
  • JAVA:如何创建 http url 连接选择要使用的 IP 地址

    我在多个 NIC 上配置了一个公共 IP 地址池 在我的 JAVA 项目中 该项目在 LINUX 计算机上运行 我需要从池中选择一个特定的 IP 地址 并使用该 IP 创建一个 HttpURLConnecion 此外 我将在池上循环 每次使
  • 模拟用户活动

    我想模拟 Windows 计算机中的用户活动 例如鼠标左键单击 此外我想执行预定义的步骤可重复性 有没有可用的工具 请建议我一个简单又好的方法来做到这一点 我已经使用 AutoIT v3 很长时间了 强烈推荐它 http www autoi
  • Python 异步任务和 CPU 密集型任务?

    我最近一直在使用 Flask 在 python 中开发一个宠物项目 它是一个简单的 Pastebin 具有服务器端语法突出显示 pygments 的支持 因为这是一项成本高昂的任务 所以我将语法突出显示委托给了 celery 任务队列 并在