Python 应用服务器+邮件服务器上的DJANGO芹菜

Python 应用服务器+邮件服务器上的DJANGO芹菜,python,django,celery,django-celery,celery-task,Python,Django,Celery,Django Celery,Celery Task,我正在尝试在应用服务器上用单独的邮件服务器配置DJANGO+芹菜 两台服务器具有相同的文件: app_name/settings.py BROKER_URL = "sqs://%s:%s@" % (AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY) CELERY_TIMEZONE = 'America/New_York' CELERY_ACCEPT_CONTENT = ['pickle','json', 'msgpack', 'yaml'] from celery.

我正在尝试在应用服务器上用单独的邮件服务器配置DJANGO+芹菜

两台服务器具有相同的文件:

app_name/settings.py

BROKER_URL = "sqs://%s:%s@" % (AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY)
CELERY_TIMEZONE = 'America/New_York'
CELERY_ACCEPT_CONTENT = ['pickle','json', 'msgpack', 'yaml']
from celery.schedules import crontab
from datetime import timedelta
CELERY_ROUTES = {
                'mail.tasks.send_reminder_email_end_user': {'queue': 'scheduler'},
                'mail.tasks.send_all_daily_new_user_email': {'queue': 'scheduler'},
                'mail.tasks.send_notification_email': {'queue': 'scheduler'},
                'mail.tasks.send_new_post_daily_email': {'queue': 'scheduler'},
                'insightStat.tasks.save_stats_history_daily': {'queue': 'scheduler'},
                }

CELERY_DISABLE_RATE_LIMITS = True
CELERYBEAT_SCHEDULE = {
    'send_reminder_email_daily': {
        'task': 'mail.tasks.send_reminder_email_end_user',
        'schedule': crontab(minute= 0,hour=7)
    },
    'update_stats_history_daily': {
        'task': 'insightStat.tasks.save_stats_history_daily',
        'schedule': crontab(minute= 0,hour=1)
    },
    'send_notification_email_weekly': {
        'task': 'mail.tasks.send_notification_email',
        'schedule': crontab(minute= 0,hour=8)
    },
    'send_digest_email_daily': {
        'task': 'mail.tasks.send_new_post_daily_email',
        'schedule': crontab(minute= 0,hour=8)
    },
    'send_daily_new_users': {
    'task': 'mail.tasks.send_all_daily_new_user_email',
    'schedule': crontab(minute= 0,hour=7)
    },
    'send_digest_email_weekly': {
        'task': 'mail.tasks.send_weekly_digest',
        'schedule': crontab(minute= 0,hour=8,day_of_week='Mon')
    },


}
mail/tasks.py文件:

@shared_task(queue='scheduler')
def send_all_daily_new_user_email():
    apps = Application.objects.all()
    for app in apps:
        daily_new_user_email.delay(app)


@shared_task(queue='daily_user')
def daily_new_user_email(app):
    print "sending daily_new_user_email"
    if not app.digest_email:
        print "app digest is off, return"
        return
    if not app.owner.all():
        return
    yesterday = date.today() - timedelta(days=1)
    users= app.appuser.filter(created_at__gt=yesterday)
    users_count = users.count()
    owner = app.owner.all()[0]
    if users_count == 0:
        print "no new users for %s " % owner.email
        return
    recent_user = users[0]
    subject  = "%s new subscribers" % str(users_count)
    content_html = render_to_string('daily_new_users.html',locals())
    email = owner.email
    print sendEmail(NOTIFICATION_EMAIL,email,subject,content_html,content_html,'daily_new_users')
app_name/cellery_task.py文件包含:

app = Celery('app_name', backend='', broker='"sqs://%s:%s@" % (AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY)',
            include=['mail.tasks'])

if __name__ == '__main__':
  app.start()    

# 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)
其中:scheduler是应用服务器上的Que,daily_用户是邮件服务器上的Que。我正在利用主管开始芹菜工人

这将多次向用户发送邮件。我做错了什么


另外,有人能简要介绍一下@shared_task吗?

它每次运行发送电子邮件的次数是多少?你能确认你只定义了一个应用程序吗?您是否检查过您的任务是否被多次调用,以及电子邮件任务本身是否被多次处理?