2017-10-10 12 views
1

내 알림 모델에 send_time 필드가 있습니다. 그 당시 모든 모바일 클라이언트에게 알림을 보내려고합니다.동적 스케줄링 셀로 비트 설정

내가 뭘, 내가이 작업을 생성

tasks.py 분마다

@app.task(name='app.tasks.send_notification') 
def send_notification(): 
    # here is logic to filter notification that fall inside that 1 minute time span 
    cron.push_notification() 

settings.py을 위해 그것을 예약 한 지금하고있는 중이 야 모든 일이

CELERYBEAT_SCHEDULE = { 
    'send-notification-every-1-minute': { 
     'task': 'app.tasks.send_notification', 
     'schedule': crontab(minute="*/1"), 
    }, 
} 

예상대로 작동합니다.

질문 :

send_time 분야에 따라 작업을 예약 할 수있는 방법이있다, 그래서 모든 분 동안 작업을 예약 할 필요가 없습니다.

는 구체적으로 내가 내 알림 모델로 작업의 새 인스턴스를 만들 새 항목을 얻고 그 기록의 send_time 분야에 따라 일정을합니다.

참고 : 나는

답변

1

은 지정된 날짜와 시간을 요에서 작업을 실행하려면 통지를 생성 한 후 docs

에 언급 된 작업을 호출하는 동안 u는 당신이

# here obj is your notification object, you can send extra information in kwargs 
send_notification.apply_async(kwargs={'obj_id':obj.id}, eta=obj.send_time) 

참고로 작업을 호출 할 수있는 객체 apply_asynceta 속성을 사용할 수 있습니다 : send_timedatetime을해야합니다.

+0

알림마다 동일한 작업을 호출 할 수 있습니까? 그것은 별도의 스레드로 작동합니까? – Satendra

+0

@Satendra 예이 태스크를 호출 할 때마다 다른 인스턴스로 작동합니다. –

+0

감사합니다. @Parul이 방법은 훨씬 깨끗합니다. 제가 알려 드리겠습니다. – Satendra

1

당신은 djcelery.models에서 가져올 수 있습니다 작업을 예약 PeriodicTaskCrontabSchedule을 사용하지 django-celery 패키지 장고와 celery의 새로운 통합을 사용하고 있습니다.

from djcelery.models import PeriodicTask, CrontabSchedule 
crontab, created = CrontabSchedule.objects.get_or_create(minute='*/1') 
periodic_task_obj, created = PeriodicTask.objects.get_or_create(name='send_notification', task='send_notification', crontab=crontab, enabled=True) 

참고 :

그래서 코드는 같을 것이다 당신은 당신은 알림 작업을 예약 할 수 있습니다


'app.tasks.send_notification'와 같은 작업에 전체 경로를 작성해야 같은 알림 모델의 post_save에 :

@post_save 
def schedule_notification(sender, instance, *args, **kwargs): 
    """ 
    instance is notification model object 
    """ 
    # create crontab according to your notification object. 
    # there are more options you can pass like day, week_day etc while creating Crontab object. 
    crontab, created = CrontabSchedule.objects.get_or_create(minute=instance.send_time.minute, hour=instance.send_time.hour) 
    periodic_task_obj, created = PeriodicTask.objects.get_or_create(name='send_notification', task='send_notification_{}'.format(instance.pk)) 
    periodic_task_obj.crontab = crontab 
    periodic_task_obj.enabled = True 
    # you can also pass kwargs to your task like this 
    periodic_task_obj.kwargs = json.dumps({"notification_id": instance.pk}) 
    periodic_task_obj.save() 
+0

어떤 알림 개체 작업이 실행되고 있는지 식별하려면 어떻게해야합니까? – Satendra

+0

답변을 편집했습니다. –

+0

대답 해 주셔서 감사합니다.이 방법이 효과가 있다고 생각합니다. 다시 시도해 보겠습니다. – Satendra