python - 如何为我的烧瓶应用程序为在线用户创建 rq 工作人员?(使用redis服务器)
问题描述
我对 rq 工作人员的工作方式感到困惑!我创建了一个烧瓶 Web 应用程序,它在 redis 服务器上运行一个后台进程,然后返回结果。到目前为止,在开发过程中,我一直在使用命令行在我的机器上启动 rq 工作进程。但是,现在我已准备好在线启动我的应用程序。但是当远程用户尝试在线运行应用程序时,worker 托管在哪里?
我尝试使用直接在我的代码中启动它们with Connection():
并且它有效,但它也中断了启动 Web 应用程序以在我的浏览器中运行的过程。
谢谢你的帮助!
编辑:为了使我的问题更具体,我在我的机器上使用命令行启动了一个 rq 工作人员,但是当我在远程 redis 服务器(托管在 AWS EC2 上)上启动任务时,应用程序停止并且没有工作人员活动。我的 rq 工作人员的配置是否有问题,或者我应该以另一种方式启动它们?我所做的只是import rq
然后运行rq worker simulator
,这对于本地开发来说已经足够了;如果有我需要更改的配置,我是否在命令行中这样做?
编辑2:我让它工作了。我只需要运行rq worker simulator --url {ec2 address}
。感谢 Paul Becotte 的解释为我指明了正确的方向。
解决方案
通常使用任务队列(我对 rq 只是模糊地熟悉——请原谅我缺乏细节,但认为这里没有必要)这个想法是将工作从请求/响应周期中分离出来。您不希望需要 30 秒的请求 - 尤其是当您有其他请求进来时!
在这个世界上,你有一个状态源(redis)和一堆使用它的客户端。您的用户连接到您的 api 以发送请求。您的 api 连接到状态源。为此,可能有两个端点——启动任务和检查状态。您的 api 在“开始任务”上向 pub/sub 发送一条消息,并在调用检查状态时查找该任务的结果。
您还可以启动 X 工作进程。它们连接到 redis 以及订阅者。当一个任务进入时,一个工作人员将它捡起并工作,然后将结果发送回redis。您运行了足够多的这些流程,以使您的流量保持较低的总周期时间。
您根本不会在任何工作程序或 api 端点中存储任何状态,因此您可以水平扩展它们 - 在任意数量的机器上启动任意数量的机器。那么你唯一需要维护的是你的redis服务器——确保它是稳定的并备份了一切(你也可以集群redis并获得HA,但这是一个更长的讨论)。
推荐阅读
- html - 如何在图像悬停而不是文本悬停上显示文本 - CSS/SASS
- python - 通过 __getitem__ 方法重载更改类型是否很好?
- python - Redis mget 无法与 redis-py-cluster 客户端按预期工作
- wordpress - 显示自定义类型分类概览页面
- database - 社交账户和普通账户数据库模型
- go - 使用给定的时间戳跟踪当前年份和月份
- android - 如何在 Room @Query 中使用 ROW_NUMBER()?
- vue.js - 如何仅从 Nuxt 的 buefy 导入导航栏、下拉菜单和模态框?
- javascript - 在 JavaScript 中使用默认参数,就像在 C# 中一样
- python - 在 PyCharm 中运行调试时设置 DJANGO_SETTINGS_MODULE 变量时出错