6

我正在从 Django 发送电子邮件(使用 Webfaction)。但是,这很慢,所以我想在后台发送电子邮件,即使电子邮件尚未发送,也会向用户返回响应。

有什么想法是最好的方法吗?

我读过关于芹菜的文章,但设置它似乎有很多步骤:http: //markliu.me/2011/sep/29/django-celery-on-webfaction-using-rabbitmq/没关系,但我想知道这是在尝试之前要走的路。

线程呢?http://www.artfulcode.net/articles/threading-django/

还是cron作业?http://docs.webfaction.com/software/general.html

其他你有经验吗?

4

4 回答 4

4

让我们对可能的解决方案做一个简单的概述:

  1. 线程是不好的解决方案 - 因为它们仅在您的响应未发送之前才有效。

  2. Celery - 是标准方式,很容易添加到 django(只需查看有关 django-celery 的大量教程之一,对于您使用数据库作为代理的任务就足够了)

  3. Cron 工作 - 不是真正好的程序员方式,因为您的代码将存储在您的 repo 和系统 crontab 中。所以每次你都应该考虑一下。

  4. 另一种方法是使用 Eventlet 或 Gevent 之类的东西。绿色线程将在空闲状态下工作,并且对于您的标准任务 - 很容易添加。缺点: - 你应该对greenlet了解很多,你应该小心greenlet中的错误捕获。

我推荐使用 Celery,因为它现在很容易添加,有很多教程和文档。此外,它会随着您的应用程序轻松成长。

于 2012-11-26T15:53:40.543 回答
2

我可能会选择Python RQ。这是 Celery 的一个更简单的替代品,并且非常易于设置和使用。不过,您需要 redis。

于 2012-11-26T16:45:11.393 回答
1

取决于您的应用程序的规模。如果计划保持最小和小,线程工作正常,cronjobs 也可以。但是您很快就会想将大量工作委托给后台以加快请求/响应时间。所以,是的,在 webfaction 上设置 celery+rabbit 是一项半复杂的任务(去过那里),但从长远来看,你会节省时间和精力。

于 2012-11-26T16:00:15.783 回答
1

我会强烈考虑使用芹菜。它并不像看起来那么复杂,是执行任意异步任务的好工具。但是,有一种简单的方法可以使用 Django 和标准的 cron 作业来处理后台电子邮件。

首先,创建一个 Django 模型来保存要发送的电子邮件。

class EmailsToSend(models.Model):
  email = models.Email...
  .
  . 
  .

接下来,创建一个 Django 管理命令来发送未发送的电子邮件。有关如何执行此操作的更多详细信息,请参阅Django 文档。此代码为您提供了基本概念。

class Command(BaseCommand):

    def handle(self, *args, **options):
        emails = EmailsToSend.objects.all()
        for email in emails:
           send_my_email(email)
           email.delete()

然后,您可以使用 cron 作业安排此命令。但是,我个人更愿意使用 Celery 或类似的东西。前期工作要多一些,但从长远来看是有回报的。

于 2012-11-26T17:08:46.627 回答