gpt4 book ai didi

python - 在 Flask 中实现单个 worker 的最佳方式

转载 作者:太空宇宙 更新时间:2023-11-04 08:17:54 25 4
gpt4 key购买 nike

我有一些蜘蛛程序可以下载页面并将数据存储在数据库中。我已经创建了带有显示数据库的管理面板(通过 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 不符合您的内存限制,您可以在我们的错误跟踪器上提出一个问题,我相信它会得到关注,或者您甚至可以帮助我们这样做。

关于python - 在 Flask 中实现单个 worker 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10872287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com