2016-11-13 18 views
3

我剛剛熟悉芹菜,並有一個問題。我的設置是Django的Redis的芹菜芹菜集團在一個設計多個任務

讓我們一個任務發送電子郵件的例子:

任務

@task 
def send_email(message): 
    mailserver.sendOneMessage(message) 

VIEWS

class newaccount(APIView): 
    def post(self, request, format=None): 
    send_email.delay(request.data.email) 

這工作完全, Django將消息發送給Redis,然後由Celery接收,然後執行任務。但是我想改進系統,以便Celery以一定的時間間隔從Redis獲取所有消息,並執行包含多條消息的單個任務。這是因爲連接到電子郵件服務器的速度很慢,並且作爲單個請求發送多個郵件會導致更快的過程。

我想是這樣工作的:

任務

@task 
def send_emails(messages): 
    mailserver.sendMultipleMessages(messages) 

的思考?

+0

您是否嘗試將任務傳遞給任務的電子郵件數組,然後在任務中循環發送這些電子郵件? – Niloct

+0

@Niloct這是​​不可能的。電子郵件在用戶授權步驟添加。我想以後可以使用redis和定期芹菜任務手動對它們進行分組,但我不確定如何正確設計它。 –

回答

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.運行兩個工人芹菜和芹菜節拍和利潤!