【问题标题】:Django 1.6.5 with Celery 3.1 for Periodic TasksDjango 1.6.5 和 Celery 3.1 用于定期任务
【发布时间】:2014-08-22 12:22:40
【问题描述】:

我是 Django 1.6.5 的新手,我刚刚完成了投票教程:

https://docs.djangoproject.com/en/dev/intro/tutorial01/

我的目标是:

  1. 设置定期任务,以便从 Oracle 服务器获取数据,并将其数据复制到我的 SQLite 数据库。 (每小时)
  2. 复制数据后,我应该在SQLite数据库中将数据组织成我自己的格式。

目前我的文件夹内容是:

/Dashboard_Web
    /Dashboard_Web
        /settings.py
        /url.py
        /wsgi.py
        /__init___.py
    /WebApp
        /admin.py
        /models.py
        /tasks.py
        /tests.py
        /view.py
        /__init__.py
    /db.sqlite3
    /manage.py

目前除了models.py之外没有太多:来自oracle服务器的数据将被复制到mapt、datt和sett。然后我会将数据放入新表中,称为 data_parsed,它是 mapt、datt 和 sett 的组合。

from django.db import models

# Create your models here.

class mapt(models.Model):
    s = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=200)

class datt(models.Model):
    s = models.IntegerField(primary_key=True)
    setid = models.IntegerField()
    var = models.IntegerField()
    val = models.IntegerField()

class sett(models.Model):
    setid = models.IntegerField()
    block = models.IntegerField()
    username = models.IntegerField()
    ts = models.IntegerField()

class data_parsed(models.Model):
    setid = models.CharField(max_length=2000)
    block = models.CharField(max_length=200)
    username = models.CharField(max_length=200)
    data = models.CharField(max_length=2000)
    time = models.IntegerField()

我读过 this question 关于 django + 周期性任务的文章

我的问题是:celery -A proj worker -B -l info 命令,我的问题是,如果我将我的 django 项目放到生产服务器(Gunicorn、apache)上,celery worker 会自动执行吗?

===================================编辑============ =======================

对不起,如果我没有早点说,我正在使用 Windows,我不能使用 Ubuntu(我很乐意),因为公司 IT 不支持它(我可以在 VMware 上安装 Ubuntu ,但它无法访问互联网。

目前我关注了 celery 的tutorial,我做了这些步骤:

  1. 在我的 Windows 机器上安装并下载了 Erlang 和 RabbitMQ
  2. 创建了 3 个文件:celery.py、tasks.py、____init____.py

因此当前文件夹格式如下:

/Dashboard_Web
    /Dashboard_Web
        /settings.py
        /url.py
        /wsgi.py
        /__init___.py <== Updated
        /celery.py <=== Added
    /WebApp
        /admin.py
        /models.py
        /tasks.py
        /tests.py
        /view.py
        /__init__.py
        /tasks.py <=== Added
    /db.sqlite3
    /manage.py

Celery.py 的内容:

from __future__ import absolute_import

import os

from celery import Celery

from django.conf import settings

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Dashboard_Web.settings')

app = Celery('Dashboard_Web')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

____init____.py 的内容:

from __future__ import absolute_import

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

tasks.py 的内容:

from __future__ import absolute_import

from celery import shared_task


@shared_task
def add(x, y):
    return x + y


@shared_task
def mul(x, y):
    return x * y


@shared_task
def xsum(numbers):
    return sum(numbers)

@periodic_task(run_every=(crontab(hour="*", minute="*", day_of_week="*")))
def scraper_example():
    print("Hello World")
    logger.info("Start task")
    logger.info("Task finished: result")

我能够执行:

python manage.py runserver
celery -A Dashboard_Web worker -l INFO 

没有任何问题,但是控制台中没有显示任何内容:

[2014-07-02 11:46:12,835: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672//
[2014-07-02 11:46:12,880: INFO/MainProcess] mingle: searching for neighbors
[2014-07-02 11:46:13,957: INFO/MainProcess] mingle: all alone
C:\Python27\lib\site-packages\celery\fixups\django.py:236: UserWarning: Using settings.DEBUG leads to a memory leak, nev
er use this setting in production environments!
  warnings.warn('Using settings.DEBUG leads to a memory leak, never '

[2014-07-02 11:46:13,994: WARNING/MainProcess] C:\Python27\lib\site-packages\celery\fixups\django.py:236: UserWarning: U
sing settings.DEBUG leads to a memory leak, never use this setting in production environments!
  warnings.warn('Using settings.DEBUG leads to a memory leak, never '

[2014-07-02 11:46:14,012: WARNING/MainProcess] celery@LEIMAX1 ready.

【问题讨论】:

    标签: python django


    【解决方案1】:

    这是主管的步骤

    >> apt-get install supervisor
    >> service supervisor restart
    

    然后在/etc/supervisor/conf.d/celery.conf 中创建一个conf 文件,其中包含类似于:

    [program:celery-worker]
    command=/root/.virtualenvs/test/bin/celery -A Dashboard_Web worker -l INFO
    autostart=true
    autorestart=true
    stderr_logfile=/var/log/long.err.log
    stdout_logfile=/var/log/long.out.log
    
    [program:celery-beat]
    command=/root/.virtualenvs/test/bin/celery -A Dashboard_Web beat -l INFO
    autostart=true
    autorestart=true
    stderr_logfile=/var/log/long.err.log
    stdout_logfile=/var/log/long.out.log
    

    您还应该使用此tutorial 设置celery.py

    然后运行:

    >> supervisorctl reread
    >> supervisorctl update
    

    通过运行查看状态

    >> supervisorctl status
    

    【讨论】:

    • 感谢您的回复!我已经编辑了我的帖子,不幸的是,我没有使用 ubuntu
    • 尝试在一个标签中运行celery -A Dashboard_Web worker -l INFO,在另一个标签中运行celery -A Dashboard_Web beat -l INFO。节拍模式是将要在工作人员消耗它们的地方运行的任务排队。我也遇到了这个链接mrtn.me/blog/2012/07/04/…
    • 这行得通!我对 Celery 不熟悉,我正在尝试让这个简单的示例正常工作。然后似乎工人和节拍必须同时存在。是否有用于监督的 windows 版本?当我也运行服务器时,celery worker 和 beat 可以自动启动吗?
    • 其实无视我的评论,好像博客里有我评论的答案。感谢您的帮助!
    猜你喜欢
    • 2014-02-23
    • 2022-01-01
    • 2012-05-09
    • 2013-12-05
    • 2017-01-06
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 2016-12-28
    相关资源
    最近更新 更多