Django 1.6.5与Celery 3.1用于周期性任务
我刚接触Django 1.6.5,刚完成了投票的教程:
我的目标是:
- 设置定期任务,从Oracle服务器获取数据,并将这些数据复制到我的SQLite数据库中。(每小时一次)
- 复制完数据后,我需要将数据整理成我自己想要的格式,存入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()
我看过这个问题,关于Django和定期任务的内容。
我的问题是:celery -A proj worker -B -l info这个命令,如果我把我的Django项目放到生产服务器上(使用Gunicorn和Apache),celery工作进程会自动执行吗?
==================================编辑==================================
抱歉之前没说,我是在Windows上使用,不能使用Ubuntu(我很想用),因为公司IT不支持(我可以在VMware上安装Ubuntu,但没有网络连接)。
目前我按照celery的教程,完成了以下步骤:
- 在我的Windows机器上安装并下载了Erlang和RabbitMQ
- 创建了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.
1 个回答
2
以下是设置 supervisor 的步骤
>> apt-get install supervisor
>> service supervisor restart
接下来,在 /etc/supervisor/conf.d/celery.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
你还需要根据这个 教程 来设置 celery.py
。
然后运行:
>> supervisorctl reread
>> supervisorctl update
通过运行以下命令查看状态:
>> supervisorctl status