【问题标题】:Long running tasks in Pyramid web appPyramid Web 应用程序中长时间运行的任务
【发布时间】:2014-10-04 18:05:03
【问题描述】:

我需要在 Web 应用程序的后台运行一些任务(检查代码等)而不阻塞视图。

典型的Queue/Celery 场景中的转折点是,无论最终结果如何,我都必须确保任务能够完成,即使网络应用程序崩溃或重新启动也能幸存下来,直到这些任务完成。

我正在考虑在数据库中记录 multiprocessing.Pool 的参数,并在 webapp 重新启动时启动所有未完成的任务。这是可行的,但我想知道是否有更简单或更划算的方法?

更新:为什么不是芹菜本身?好吧,我在一些项目中使用了 Celery,它确实是一个很棒的解决方案,但对于这项任务来说,它的作用很大:它需要一个单独的服务器、通信等,而我所需要的只是产生一些进程/线程,做一些在其中工作(git clone ...svn co ...)并检查它们是成功还是失败。另一个问题是我需要解决方案尽可能小,因为我必须让它遵循详细的公司指导方针、程序等,而且我必须通过人力行政和官僚开销才能让 Celery 加入。如果可以的话,我宁愿避免。

【问题讨论】:

  • 您提到了 Celery - 是什么让您忽略它并发明自己的解决方案?该任务看起来像是 Celery 的典型用例

标签: python queue pyramid background-process pylons


【解决方案1】:

我建议你使用 Celery。

Celery 不需要自己的服务器,你可以在同一台机器上运行一个 worker。您还可以使用 SQL 数据库而不是“真正的”队列/消息传递服务器(例如 RabbitMQ)来创建“穷人队列”——这种设置看起来非常像您所描述的,只是有一个单独的进程来执行长-正在运行的任务。

从网络服务器进程启动长时间运行的任务的问题在于,在生产环境中,网络“工作人员”通常由网络服务器管理 - 可以随时产生或杀死多个工作人员。您的方法的可行性在很大程度上取决于您使用的 Web 服务器及其配置。此外,如果有多个工作人员各自尝试执行一项任务,您可能会遇到一些并发问题。

除了 Celery,另一种选择是查看 UWSGI's spooler subsystem,尤其是如果您已经在使用 UWSGI。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多