#celery#周期性任务
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
玩了一個星期的clannad,是時候干點事了。
折騰了下celery周期性任務(wù):
celery提供了一個叫celery beat的服務(wù),用于定時驅(qū)使worker執(zhí)行任務(wù)。也就是說,如果本地沒有活動的worker,它將不會得到任何執(zhí)行結(jié)果,他只是負(fù)責(zé)把任務(wù)消息傳到rabbitmq,一旦啟動一個可用worker,則自動從rabbitmq獲取任務(wù)信息并執(zhí)行。
與此配置相關(guān)的參數(shù)是CELERYBEAT_SCHEDULE,我把我的celery應(yīng)用proj的所有配置內(nèi)容都放置在一個config.py文件中:
from?__future__?import?absolute_import from?datetime?import?timedelta from?celery.schedules?import?crontabCELERY_TASK_RESULT_EXPIRES=3600 CELERY_TASK_SERIALIZER='json' CELERY_ACCEPT_CONTENT=['json'] CELERY_RESULT_SERIALIZER='json'CELERYBEAT_SCHEDULE?=?{'add-every-1-min':?{'task':?'proj.agent.add','schedule':?crontab(),'args':?(16,?16),}, } #CELERYBEAT_SCHEDULE?=?{ #????'add-every-2-seconds':?{ #????????'task':?'proj.agent.add', #????????'schedule':?timedelta(seconds=3), #????????'args':?(16,?16) #????}, #}CELERY_TIMEZONE?=?'UTC'目前的定時任務(wù)是:
add-every-4-stask指定了相應(yīng)的任務(wù):proj目錄下agent模塊的add函數(shù)
schedule指定了定時工具,這里是celery.schedules的crontab
args是任務(wù)的參數(shù)
此時我們回到proj所在的目錄中,啟動一個worker:
root@workgroup0:~/celeryapp/configtest#?ls celerybeat-schedule??logging??proj root@workgroup0:~/celeryapp/configtest#?celery?-A?proj?worker?--loglevel=INFO /usr/local/lib/python2.7/dist-packages/celery/platforms.py:766:?RuntimeWarning:?You?are?running?the?worker?with?superuser?privileges,?which?is absolutely?not?recommended!Please?specify?a?different?user?using?the?-u?option.User?information:?uid=0?euid=0?gid=0?egid=0uid=uid,?euid=euid,?gid=gid,?egid=egid,--------------?celery@workgroup0.hzg.com?v3.1.17?(Cipater) ----?****?-----? ---?*?***??*?--?Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty --?*?-?****?---? -?**?----------?[config] -?**?----------?.>?app:?????????proj:0x7f0027635510 -?**?----------?.>?transport:???amqp://guest:**@localhost:5672// -?**?----------?.>?results:?????amqp://guest@loaclhost// -?***?---?*?---?.>?concurrency:?1?(prefork) --?*******?----? ---?*****?-----?[queues]--------------?.>?celery???????????exchange=celery(direct)?key=celery[tasks].?proj.agent.add.?proj.agent.mul.?proj.agent.writefile.?proj.agent.xsum[2015-05-24?15:00:37,873:?INFO/MainProcess]?Connected?to?amqp://guest:**@127.0.0.1:5672// [2015-05-24?15:00:37,940:?INFO/MainProcess]?mingle:?searching?for?neighbors [2015-05-24?15:00:38,980:?INFO/MainProcess]?mingle:?all?alone [2015-05-24?15:00:39,021:?WARNING/MainProcess]?celery@workgroup0.hzg.com?ready.worker啟動成功,此時再開一個終端,啟動beat服務(wù):
返回看看worker的輸出:
[2015-05-24?15:01:50,827:?INFO/MainProcess]?Task?proj.agent.add[9b6f962a-9b66-4fde-916f-fc5a951ad599]?succeeded?in?0.0342152439989s:?{'value':?'32'} [2015-05-24?15:02:24,923:?INFO/MainProcess]?Received?task:?proj.agent.add[e4b9840b-09f6-4db6-88c1-2a418b11d393] [2015-05-24?15:02:24,947:?INFO/MainProcess]?Task?proj.agent.add[e4b9840b-09f6-4db6-88c1-2a418b11d393]?succeeded?in?0.0200459280004s:?{'value':?'32'} [2015-05-24?15:03:00,015:?INFO/MainProcess]?Received?task:?proj.agent.add[98f44dd1-e6e2-4457-bfd6-ff59d0ee6d2f] [2015-05-24?15:03:00,031:?INFO/MainProcess]?Task?proj.agent.add[98f44dd1-e6e2-4457-bfd6-ff59d0ee6d2f]?succeeded?in?0.0125673500006s:?{'value':?'32'}這就是周期性任務(wù)的執(zhí)行。
遇到的坑:
在配置文件中,from __future__ import absolute_import這一行很關(guān)鍵,如果沒有這一行,
from?celery.schedules?import?crontab這個命令執(zhí)行時會報錯,celery beat無法正常啟動。
補(bǔ)充:
默認(rèn)情況下,celery beat使用UTC時區(qū),你也可以配置其他時區(qū):
關(guān)于設(shè)置任務(wù)執(zhí)行周期,你可以通過datetime的timedelta設(shè)置,可以讓任務(wù)執(zhí)行間隔精確到秒,相應(yīng)的配置如下:
CELERYBEAT_SCHEDULE?=?{'add-every-2-seconds':?{'task':?'proj.agent.add','schedule':?timedelta(seconds=3),'args':?(16,?16)}, }也可以用crontab風(fēng)格的:
CELERYBEAT_SCHEDULE?=?{#?Executes?every?Monday?morning?at?7:30?A.M'add-every-1-min':?{'task':?'proj.agent.add','schedule':?crontab(),'args':?(16,?16),}, }關(guān)于一個CELERYBEAT_SCHEDULE的可以配置的參數(shù),以及crontab的詳細(xì)示例,請參見celery官方文檔。
關(guān)于啟動celery beat的tips,我這里只貼原文:
Starting the Scheduler
To start the?celery beat?service:
$?celery?-A?proj?beatYou can also start embed?beat?inside the worker by enabling workers?-B?option, this is convenient if you will never run more than one worker node, but it’s not commonly used and for that reason is not recommended for production use:
$?celery?-A?proj?worker?-BBeat needs to store the last run times of the tasks in a local database file (namedcelerybeat-schedule?by default), so it needs access to write in the current directory, or alternatively you can specify a custom location for this file:
$?celery?-A?proj?beat?-s?/home/celery/var/run/celerybeat-schedule轉(zhuǎn)載于:https://my.oschina.net/hochikong/blog/419191
總結(jié)
以上是生活随笔為你收集整理的#celery#周期性任务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oncontextmenu事件
- 下一篇: Java 操作POI 之复制sheet页