V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
leisurelylicht
V2EX  ›  Python

django + celery 做定时任务

  •  
  •   leisurelylicht · 2018-12-24 16:34:50 +08:00 · 2817 次点击
    这是一个创建于 2163 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请问我现在想用 django + celery 做定时任务从外部拉取数据后写库。

    但是如果我的项目为了做负载均衡同时部署在两台服务器上,那么定时任务就会执行两次。

    这种情况应该怎么避免?

    12 条回复    2018-12-24 17:56:07 +08:00
    tulongtou
        1
    tulongtou  
       2018-12-24 16:42:34 +08:00 via iPhone
    celery 只在一台服务器上跑就好了
    lanqing
        2
    lanqing  
       2018-12-24 16:42:59 +08:00
    celery 不是可以分布式的么,, 为啥会执行两次呀
    你是不是将你的项目完完全全复制了一份 用了两个 celery
    leisurelylicht
        3
    leisurelylicht  
    OP
       2018-12-24 16:45:29 +08:00
    @tulongtou celery 不是和 django 集成在一起的吗?怎么单独放到一台服务器上?
    @lanqing 对,我其实就是在两台服务器上整体部署了两次
    leisurelylicht
        4
    leisurelylicht  
    OP
       2018-12-24 16:46:45 +08:00
    @tulongtou 是说 celery 的 beat 和 work 只在一台服务器上启动就行吗
    lanqing
        5
    lanqing  
       2018-12-24 16:49:28 +08:00
    beat 启动后,会将任务丢到 redis 中, 很多机器上中的某一个 worker 会执行这个任务
    只要 url 一样就可以实现,我单独写 celery 是这样的 django-celery 应该差不多
    lanqing
        6
    lanqing  
       2018-12-24 16:49:53 +08:00
    只需一个 beat,worker 可以多个
    leisurelylicht
        7
    leisurelylicht  
    OP
       2018-12-24 17:17:42 +08:00
    @lanqing celery 定时任务的启动不是由 django 发起的,是由 beat 发起的?我还以为定时任务是由 Django 发起丢给 beat 然后再分配执行的呢。
    leisurelylicht
        8
    leisurelylicht  
    OP
       2018-12-24 17:26:33 +08:00
    @lanqing 但是 django 不是直接连 redis 或 rabbitmq 的吗?难道定时任务的发起不是 django->redis->beat 这个流程吗
    gnozix
        9
    gnozix  
       2018-12-24 17:28:30 +08:00
    celery 怎么会是和 Django 一起呢,celery 应该都是单独部署的吧
    lanqing
        10
    lanqing  
       2018-12-24 17:35:21 +08:00
    关于定时任务这个由谁发起的,我不能定论.
    但是 django 中有两种写定时任务的方法,一种是 settings 中直接配置(我觉得你是这种),还有一种是动态添加
    ```
    CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
    ```
    所有的定时任务都是又这个 Scheduler 调度的,添加任务删除任务的时候,这个 Scheduler 都能自动更新(其实就是读表,可以在数据库找到表 crontab,xxx 等表)
    这个 Scheduler 将任务丢到 redis 中,worker 就知道有任务了,就执行了,其实跟 django 我觉得没任何关系
    leisurelylicht
        11
    leisurelylicht  
    OP
       2018-12-24 17:52:20 +08:00
    @lanqing 我好像明白了。我之前因为在启动 celery 时要指定 django app 所以误以为是由 django 做的任务发起。其实这个只是为了获取相关配置。
    kernelG
        12
    kernelG  
       2018-12-24 17:56:07 +08:00
    我大概知道你说的意思,如你所说,两个机器的任务其实是互斥的。
    其实你这里的逻辑就有问题。
    如果你是为了做分布式,那么两台机器都做定时任务本来就是正确的啊,为什么会互斥呢?
    如果你说的是同一个任务,不应该被重复执行两次,那么你应该引入一个队列弹出的机制
    总之你应该理顺一下思路,我感觉你是有点模糊的。一楼答案就说的很好,如果不想两个一起跑,你只跑一个机器就行了啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1729 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:45 · PVG 00:45 · LAX 08:45 · JFK 11:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.