我有一些蜘蛛下载页面并将数据存储在数据库中。我创建了带有显示数据库的管理面板(通过 Flask-Admin 扩展)的烧瓶应用程序。现在我想将函数附加到我的烧瓶应用程序以控制蜘蛛状态:打开/关闭。
我认为它可以通过线程或多处理来实现。Celery 不是一个好的决定,因为整个程序必须使用最少的内存。
选择哪种方法来实现这个功能?
我有一些蜘蛛下载页面并将数据存储在数据库中。我创建了带有显示数据库的管理面板(通过 Flask-Admin 扩展)的烧瓶应用程序。现在我想将函数附加到我的烧瓶应用程序以控制蜘蛛状态:打开/关闭。
我认为它可以通过线程或多处理来实现。Celery 不是一个好的决定,因为整个程序必须使用最少的内存。
选择哪种方法来实现这个功能?
根据内存使用情况对 Celery 进行折扣可能是一个错误,因为 Celery 在时间和空间上的开销都很低。事实上,使用 Celery+Flask 并不会比单独使用 Flask 使用更多的内存。
此外,Celery 还提供了几种选择,这些选择可能会影响使用的内存量。例如,有 5 种不同的池实现,它们都有不同的优势和权衡,池的选择是:
默认情况下,Celery 使用多处理,这意味着它将产生子进程来卸载工作。这是最昂贵的内存选项 - 仅仅是因为每个子进程都会复制所需的基本内存量。
但是 Celery 还带有一个自动缩放功能,它会在没有什么工作要做时杀死工作进程,并在有更多工作时产生新进程:
$ celeryd --autoscale=0,10
其中 0 是最小进程数,10 是最大进程数。这里 celeryd 将开始时没有子进程,并根据负载增长到最多 10 个进程。当负载减少时,工作进程的数量也会减少。
当使用 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 不符合您的内存限制,您可以在我们的错误跟踪器上打开一个问题,我相信它会得到关注,或者您甚至可以帮助我们这样做。
您可以使用多进程或子进程来管理进程,然后只需将句柄交给会话即可。