用于周期性任务的Django 1.6.5与Celery 3.1

时间:2014-07-01 20:31:01

标签: python django

我是Django 1.6.5的新手,我刚刚完成了民意调查教程:

  

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

我的目标是:

  1. 设置定期任务,以便从Oracle Server获取数据,并将其数据复制到我的SQLite数据库。 (每小时)
  2. 复制数据后,我应该在SQLite数据库中将数据组织成我自己的格式。
  3. 目前我的文件夹内容是:

    /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),芹菜工作者会自动执行吗?

    ================================== EDIT ============ ======================

    很抱歉,如果我之前没有说过,我使用的是Windows,而且我不能使用Ubuntu(我很乐意),因为公司的IT部门并不支持它(我可以在VMware上安装Ubuntu,但它不能访问互联网。

    目前我跟着芹菜tutorial,我做了以下步骤:

    1. 在我的Windows机器上安装并下载了Erlang和RabbitMQ
    2. 创建了3个文件:celery.py,tasks.py,____ init ____。py
    3. 因此,当前文件夹格式如下:

      /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 个答案:

答案 0 :(得分:2)

以下是主管的步骤

>> 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