我有一些蜘蛛可以下载页面并将数据存储在数据库中。我已经创建了带有显示数据库的管理面板(通过 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 与您的内存限制不匹配,您可以在我们的错误跟踪器上打开一个问题,我相信它会得到关注,或者您甚至可以帮助我们这样做。
您可以使用多进程或子进程来超进程,然后只需在会话周围使用手柄即可。