我有一些蜘蛛程序可以下载页面并将数据存储在数据库中。我已经创建了带有显示数据库的管理面板(通过 Flask-Admin 扩展名)的 Flask 应用程序。 现在我想将功能附加到我的 flask 应用程序以控制蜘蛛状态:打开/关闭。
我认为线程或多处理是可能的。 Celery 不是一个好的决定,因为整个程序必须使用最少的内存。
选择哪种方法实现这个功能?
请您参考如下方法:
根据内存使用情况对 Celery 进行折扣可能是错误的,因为 Celery 在时间和空间方面的开销都很低。事实上,使用 Celery+Flask 并不比单独使用 Flask 使用更多的内存。
此外,Celery 还提供了几个可以产生影响的选择 关于使用的内存量。例如,有 5 种不同的池实现,它们都有不同的优势和权衡,池选择是:
- 多处理
默认情况下,Celery 使用多进程,这意味着它会生成子进程 将工作卸载到。这是最昂贵的内存选项 - 仅仅是因为 每个子进程都会复制所需的基本内存量。
但 Celery 还带有一个autoscale 功能,该功能会杀死 worker 在没有工作要做时处理,并在有更多工作时产生新进程:
$ celeryd --autoscale=0,10
其中 0 是最小进程数,10 是最大进程数。这里 celery 会 从没有子进程开始,然后根据负载增长到最多 10 个进程。当负载减少时,工作进程的数量也会减少。
- eventlet/gevent
当使用 eventlet/gevent 池时,只会使用一个进程,因此它将 使用更少的内存,但缺点是调用阻塞代码的任务会 阻止其他任务执行。如果你的任务主要是 I/O 绑定(bind)你应该没问题, 您还可以组合不同的池并将问题任务发送到多处理池。
- 线程
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 不符合您的内存限制,您可以在我们的错误跟踪器上提出一个问题,我相信它会得到关注,或者您甚至可以帮助我们这样做。
