python celery 時區&結果(性能)的坑


本文主要介紹最近使用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM