我刚刚熟悉芹菜,有一个问题。我的设置是django - redis -芹菜
让我们以发送电子邮件的任务为例:
<<p> 任务/strong>@task
def send_email(message):
mailserver.sendOneMessage(message)
class newaccount(APIView):
def post(self, request, format=None):
send_email.delay(request.data.email)
这是完美的,Django发送消息到Redis,然后这些被芹菜拾取然后执行任务。但是我想改进系统,以便芹菜以一定的间隔从Redis获取所有消息,并执行具有多个消息的单个任务。这是因为,连接到电子邮件服务器是缓慢的,发送多个消息作为一个单一的请求将导致一个更快的过程。
我想要这样的工作:
<<p> 任务/strong>@task
def send_emails(messages):
mailserver.sendMultipleMessages(messages)
想法吗?
由于我使用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。跑芹菜工和芹菜拍都有利润!