本文主要介紹最近使用celery遇到的兩個坑。關於時區,以及是否保留結果(celery使用rabbitmq)。
先說結論:定時任務記得配置時區;丟棄結果對使用rabbitmq對celery來說,性能提升巨大。
第一部分:celery使用定時任務功能的時候,通常配置如下
CELERYBEAT_SCHEDULE = { 'query-every-day': { 'task': 'xxx', 'schedule': crontab(hour=16, minute=35) }, 'delete-every-1-second': { 'task': xxxx', 'schedule': crontab(minute='*/1') }, 'update-every-1-second': { 'task': 'xxxxx, 'schedule': timedelta(seconds=60) } }
針對xxxxx任務,每60秒執行一次;針對xxxx任務,每分鍾執行一次;針對xxx任務,每天16時35分執行一次。
啟動
celery -A start.celery beat -s celerybeat-schedule
這樣配置,后面倆間隔時間執行的定時任務執行良好。
而第一個設置每天絕對時間的任務沒有在配置的時間執行,查詢發現有時區這個東西。需要配置如下:
CELERY_TIMEZONE = 'Asia/Shanghai'
ps:最開始嘗試的'Asia/Hongkong',報錯了。看來祖國大陸的地位越來越高。
第二部分:celery的是否保留結果配置
丟棄結果配置如下:
CELERY_IGNORE_RESULT = True
為什么會推薦丟棄結果呢?
在壓測使用rabbitmq對celery時發現,每次執行單個的簡單加減任務,會耗時0.1秒左右(慢哭)。
完成任務至7000時,rabbitmq出問題了,日志顯示:
Recovering 7008 queues, avilable file handles: 4764. Please increase mas open file handles limit to at least 7008
Mnesia(rabbit@localhost): ** WARNING ** Mnesia is overloaded: {dump_log,write_threshold}
這才發現,使用rabbitmq的celery,每一次完成任務,都會為這個任務建一個隊列。。。在獲取這個結果之后隊列才刪除。
並且這個建隊列的性能開銷非常大:保留結果完成一個任務耗時0.1秒左右,丟棄結果平均一個任務耗時0.001秒左右
google了一下Mnesia的配置,找到有解決方案,但最后並沒有使用,因為這個確實用不着保留結果,並且性能的損失不太能接受。
后來發現了一篇celery最佳實踐有講到丟棄結果這個事情:http://blog.csdn.net/siddontang/article/details/34447003