在Flask中实现单个工作者的最佳方式

时间:2012-06-03 17:09:16

标签: python multithreading multiprocessing flask celery

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

我认为它可以通过线程或多处理来实现。 Celery不是一个好决定因为总计划必须使用最少的内存。

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

2 个答案:

答案 0 :(得分:6)

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

此外,Celery还提供了几种可以产生影响的选择 关于使用的内存量。例如,有5种不同的池实现都具有不同的优势和权衡,池选择是:

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

但Celery还附带了 autoscale 功能,可以杀死工人 当没有什么工作要做时会处理,并在有更多工作时产生新的流程:

$ celeryd --autoscale=0,10

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

  • eventlet / GEVENT

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

  • 线程

Celery还附带一个使用线程的池。

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

$ 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不符合您的内存限制,您可以在我们的错误跟踪器中打开一个问题,我相信它会得到关注,或者您甚至可以帮助我们这样做。

答案 1 :(得分:0)

您可以使用多进程或子进程对进程进行高级化,然后只需将句柄交给会话。