我刚刚熟悉Celery并有一个问题。我的设置是Django-Redis-Celery
让我们举例说明发送电子邮件的任务:
任务
double[] myArray1 = newArray(10d, 20d);
double[] myArray2 = newArray(3d, 4d);
视图
@task
def send_email(message):
mailserver.sendOneMessage(message)
这非常有效,Django向Redis发送消息,然后由Celery接收这些消息以执行任务。但我希望改进系统,以便Celery以一定的时间间隔从Redis中获取所有消息,并执行包含多个消息的单个任务。这是因为连接到电子邮件服务器很慢并且作为单个请求发送多个消息将导致更快的过程。
我想要这样的事情发挥作用:
任务
class newaccount(APIView):
def post(self, request, format=None):
send_email.delay(request.data.email)
思想?
答案 0 :(得分:2)
由于我使用redis作为缓存(django-redis)已经实现了以下工作流程:
步骤1.创建一个将新电子邮件添加到缓存
的任务@shared_task()
def add_email(user_id):
cache.set("email#{}".format(user_id), None, timeout=None)
步骤2.创建一个每秒运行一次的定期任务,并在缓存中查找新电子邮件
class ProcessEmailsTask(PeriodicTask):
run_every = timedelta(seconds=1)
def run(self, **kwargs):
call_email()
def call_email():
item_exists = True
ids = []
while item_exists:
try:
key = next(cache.iter_keys("email#*"))
ids.append(key.split("email#")[1])
cache.delete_pattern(key)
except:
item_exists = False
if len(ids) > 0:
send_emails_to(ids)
步骤3.运行芹菜工人和芹菜,并获利!