在 Flask 中实现单个工作线程的最佳方法



我有一些蜘蛛可以下载页面并将数据存储在数据库中。我已经创建了带有显示数据库的管理面板(通过 Flask-Admin 扩展)的烧瓶应用程序。现在我想在我的烧瓶应用程序中附加功能以控制蜘蛛状态:打开/关闭。

我认为它可以通过线程或多处理来实现。芹菜不是好决定,因为整个程序必须使用最少的内存。

选择哪种方法来实现此功能?

根据内存使用情况打折芹菜可能是一个错误,因为芹菜在时间和空间上的开销都很低。事实上,使用 Celery+Flask 并不比单独使用 Flask 使用更多的内存。

此外,芹菜还有几个你可以做出的选择,可以产生影响使用的内存量。例如,有 5 种不同的池实现,它们都有不同的优势和权衡,池选择是:

  • 多处理

默认情况下,Celery 使用多处理,这意味着它将生成子进程将工作卸载到。 这是内存最昂贵的选项 - 仅仅是因为每个子进程都将复制所需的基本内存量。

但Celery还具有自动缩放功能,可以杀死工人。当几乎没有工作要做时生成流程,当有更多工作时生成新流程:

$ celeryd --autoscale=0,10

其中 0 是进程的最小数,10 是最大值。 这里的芹菜会从没有子进程开始,然后根据负载增长到最多 10 个进程。 当负载减少时,工作进程的数量也会减少。

  • 事件/活动

使用 eventlet/gevent 池时,将仅使用单个进程,因此它将使用更少的内存,但缺点是调用阻塞代码的任务会阻止执行其他任务。 如果你的任务主要是 I/O 绑定的,你应该没问题,您还可以组合不同的池,并将问题任务发送到多处理池。

  • 线程

芹菜还配有一个使用螺纹的游泳池。

将成为2.6版本的开发版本包括许多优化,并且不再需要烧瓶-芹菜扩展模块。 如果你不去在接下来的几天投入生产,那么我鼓励您尝试开发版本必须像这样安装:

$ pip install https://github.com/ask/kombu/zipball/master
$ pip install https://github.com/ask/celery/zipball/master

新的 API 现在也受到 Flask 的启发,因此您应该阅读新的入门指南:

http://ask.github.com/celery/getting-started/first-steps-with-celery.html

综上所述,到目前为止,大多数优化工作都集中在执行速度上,并且可能还可以进行更多的内存优化。到目前为止,这还没有一个请求,但是万一 Celery 与您的内存限制不匹配,您可以在我们的错误跟踪器上打开一个问题,我相信它会得到关注,或者您甚至可以帮助我们这样做。

您可以使用多进程或子进程来超进程,然后只需在会话周围使用手柄即可。

相关内容

  • 没有找到相关文章

最新更新