芹菜组多个任务在一个设计



我刚刚熟悉芹菜,有一个问题。我的设置是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。跑芹菜工和芹菜拍都有利润!

相关内容

  • 没有找到相关文章

最新更新