python - 即使用户关闭了 Web 浏览器/选项卡,如何运行 Python 3 函数?

标签 python python-3.x shopify-api

我在处理一个 python 项目时遇到问题(我通常使用 PHP/Java,所以我缺乏一些知识)。
基本上,我有一个使用 Flask 构建的 Python 程序,该程序使用 Shopify Python API 将库存管理系统连接到 Shopify。

当用户通过 AJAX 请求触发功能时,我需要启动一个功能/流程,通过 Shopify API 更新客户 Shopify 商店中的产品。这大约需要 2 个小时(大约 7000 件产品加上必须首先从库存管理系统中提取它们)。
问题是我需要一种方法来触发这个函数/进程,即使客户端关闭浏览器,函数/进程也会继续运行。

如果有任何方法可以使用此后台功能/进程的当前进度来更新前端,那将会膨胀。

如果有人知道完成此任务的任何图书馆或资源,将不胜感激。
我有一个谷歌,但我能找到的所有解决方案似乎都是针对 CLI 脚本而不是 Web 脚本的。

谢谢堆,
科里 :)

最佳答案

您需要异步处理此任务,因为这是一项长时间运行的作业,会显着降低 HTTP 响应的性能(如果您等到它完成)。
此外,您可能会注意到,您需要在为 HTTP 请求提供服务的当前进程的单独进程中运行此任务。因为,Web 服务器(Gunicorn、uWSGI 等...)将在需要时生成它们创建的进程并释放系统资源。您很容易遇到通过 Ajax 启动的异步进程将被 Web 服务器中断和终止的情况,因为您关闭了浏览器(请求已关闭)。所以,threadingcoroutines不是执行此任务的最佳工具。
这就是为什么有一些很酷的Task queue解决您问题的项目。我们可能会注意到:

  • Celery :(生产就绪解决方案)它是一个专注于实时处理的任务队列,同时也支持任务调度。适用于 RedisRabbitMQ作为消息代理
  • RQ (Redis Queue) :RQ(Redis Queue)是一个简单的 Python 库,用于排队作业并在后台与工作人员一起处理它们。它由 Redis 提供支持,旨在降低进入阈值。它可以轻松集成到您的网络堆栈中。
  • Taskmaster :Taskmaster 是一个简单的分布式队列,设计用于处理大量一次性任务。
  • Huey : 是一个基于Redis的任务队列,旨在为执行任务提供一个简单而灵活的框架。 Huey 支持任务调度、类似 crontab 的重复任务、结果存储和失败时自动重试。
  • Dramatiq : 是 Celery 的快速可靠的替代品。它支持 RabbitMQ 和 Redis 作为消息代理。
  • APScheduler :高级 Python 调度程序 (APScheduler) 是一个 Python 库,可让您安排 Python 代码稍后执行,可以只执行一次,也可以定期执行。

  • 还有很多 !
    而随着micro services的兴起你可以结合Task queues的力量和 containers并且您可以构建一个单独的容器来处理您长时间运行的任务(并根据您的当前情况更新您的数据库)。另外,如果您不能使用 micro services架构,您可以构建一个单独的服务器来处理这些任务,并使处理用户请求的 Web 服务器免于运行长时间运行的任务。
    最后,您可以将这些解决方案组合到您当前的网站中,如下所示:
  • 用户单击按钮。
  • Ajax 请求触发您的后端(通过 API 或其他方式)
  • 您在您的代理消息中安排任务以立即或稍后运行它(在单独的容器/VPS 中...)
  • 在您的后端,您检索 Task ID任务
  • 您返回 Task ID通过 API 或其他任何方式,您将其添加到 session cookie 或处理启动进程的用户的单独表中。
  • 在某些 JS 中,您不断通过 Task ID 从后端请求任务的状态。您拥有(在用户 session cookie 中或在您的数据库中)
  • 即使用户关闭了他的浏览器,任务也会继续执行直到它完成或引发异常。在您已有的任务 ID 中,您可以轻松了解此任务的状态并将此信息发送给用户(在用户再次登录时的 View 中,通过电子邮件等...)

  • 并且确定您可以改进这种情况!

    关于python - 即使用户关闭了 Web 浏览器/选项卡,如何运行 Python 3 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61791651/

    相关文章:

    python - 如何使用 dbus 公开对象列表

    python - 大小为 x 的 1 的二维阵列菱形

    python - 使用模式从字符串中提取数字

    graphql - 从变体图像中获取多个transformedSrc

    python - 在 Shopify 中向订单时间线添加评论

    python - 生成日历Python网页

    python - Django 如何知道在 urls.py 中使用什么 'pk' ?

    python - 为单个窗口中显示的框架放置一个滚动条

    Shopify Products API 在分页中跳过项目

    python - 如何创建带参数的测试类?