在django下使用celery作为异步任务系统,十分方便。
同时celery也提供定时任务机制,celery beat。使用celery beat 可以为我们提供 cron,schedule 形式的定时任务。
在django下使用celery beat的过程中,发现了 celery beat进程 占用内存非常大,而且一直不释放。
怀疑其有内存占用不释放的可能。
因为之前使用django的时候,就知道在django中开启DEBUG模式,会为每次的SQL查询 缓存结果。
celery beat 作为 定时任务的timer和heartbeat程序,是长期运行的,而我使用了MYSQL作为存储定时任务的backend。因为每次heartbeat和timer产生的sql查询在开启了DEBUG模式下的django环境中,都会缓存查询结果集。因此 celery beat占用的 内存会一直不释放。在我的线上环境中 达到10G内存占用!
解决: 关掉django的DEBUG模式,在setting中,设置DEBUG=False 即可。
关闭DEBUG模式后的celery beat程序 的内存占用大概 一直维持在150M左右。
在django下使用celery作为异步任务系统,十分方便。同时celery也提供定时任务机制,celery beat。使用celery beat 可以为我们提供 cron,schedule 形式的定时任务。在django下使用celery beat的过程中,发现了 celery beat进程 占用内存非常大,而且一直不释放。怀疑其有内存占用不释放的可能。因为之前使用dja
celery
的
内存泄漏
?
总结:
celery
执行完任务不释放内存与原worker一直没有被销毁有关,因此
CELERY
D_MAX_TASKS_PER_CHILD可以适当配置小点,而任务并发数与
CELERY
D_CONCURRENCY配置项有关,
每增加一个worker必然增加内存消耗,同时也影响到一个worker何时被销毁,因为
celery
是均匀调度任务至每个wo...
在启动
celery
beat 命令的时候,明明配置了定时任务,但命令行启动后就是不往redis发任务,一直在writing object中(一直卡住…),worker一直消费不到消息;
经过这两天的研究得出初步结论:
可能是在某个时刻我切换了 USE_TZ 的值然后启动了服务,导致了这个
celery
扯怪叫
经过实验,如
-热数据(热点数据):体量不大、访问频率极高、更新不频繁
~网站优化第二定律:削峰 (能不马上做的事情都不要马上做)、消息队列
-遇到耗时间的任务(用户请求),用户不需要马上得到结果、
异步
化、推迟执行
-
异步
消息队列 -
celery
#在
django
中
使用
celery
模块提供消息队列服务
import os
import
celery
from
django
.conf import settings
os.environ.setdefault('DJAN
问题
描述
提示:
celery
的 worker每运行半小时就会重启,python3.8.7
celery
5.2.3 redis作为中间人
@
celery
_app.task(soft_time_limit=60) # time_limit 设置硬超时时间
def crawler_run(spider: str, url: str, **kwargs):
运行蜘蛛程序
:param spider: 蜘蛛名称
Celery
简介
除了redis,还可以
使用
另外一个神器—
Celery
。
Celery
是一个
异步
任务的调度工具。
Celery
是 Distributed Task Queue,分布式任务队列,分布式决定了可以有多个 worker 的存在,队列表示其是
异步
操作,即存在一个产生任务提出需求的工头,和一群等着被分配工作的码农。
在 Python 中定义
Celery
的时候,我们要引入 Broker,中文翻译过来就是“中间人”的意思,在这里 Broker 起到一个中间人的角色。在工
下面可以看到
celery
beat进程
占用
cpu很高
[root@iZbp1je77jss3x67qq75nuZ ~]# top -c
top - 15:55:29 up 37 days, 20:42, 3 users, load average: 1.18, 1.64, 1.58
Tasks: 442 total, 2 running, 440 sleeping, 0 stopped, 0 zombie
%Cpu(s): 26.0 us, 4.1 sy, 0.0 ni, 67.1 id