2013-06-06 31 views
23

Bằng Cần tây mặc định gửi tất cả các nhiệm vụ để 'cần tây' hàng đợi, nhưng bạn có thể thay đổi hành vi này bằng cách bổ sung thêm tham số:Làm thế nào để gửi nhiệm vụ tuần hoàn vào hàng đợi cụ thể trong cần tây

@task(queue='celery_periodic') 
def recalc_last_hour(): 
    log.debug('sending new task') 
    recalc_hour.delay(datetime(2013, 1, 1, 2)) # for example 

thiết lập Scheduler:

CELERYBEAT_SCHEDULE = { 
    'installer_recalc_hour': { 
     'task': 'stats.installer.tasks.recalc_last_hour', 
     'schedule': 15 # every 15 sec for test 
    }, 
} 
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler" 

Run nhân:

python manage.py celery worker -c 1 -Q celery_periodic -B -E 

chương trình này không hoạt động như mong đợi: công nhân này gửi nhiệm vụ tuần hoàn t o 'cần tây' hàng đợi, không phải 'celery_periodic'. Lam sao tôi co thể sửa no?

P.S. celery == 3.0.16

+0

này có thể hữu ích? http://docs.celeryproject.org/en/latest/userguide/routing.html – oleg

+0

Tôi đã tắt tùy chọn CELERYBEAT_SCHEDULER (được sử dụng dựa trên stoprage) và nó hoạt động chính xác. –

Trả lời

17

Tôi tìm thấy giải pháp cho vấn đề này:

1) Trước hết tôi đã thay đổi cách định cấu hình nhiệm vụ định kỳ. Tôi đã từng @periodic_task trang trí như thế này:

@periodic_task(run_every=crontab(minute='5'), 
       queue='celery_periodic', 
       options={'queue': 'celery_periodic'}) 
def recalc_last_hour(): 
    dt = datetime.utcnow() 
    prev_hour = datetime(dt.year, dt.month, dt.day, dt.hour) \ 
       - timedelta(hours=1) 
    log.debug('Generating task for hour %s', str(prev_hour)) 
    recalc_hour.delay(prev_hour) 

2) tôi đã viết celery_periodic hai lần trong params để @periodic_task:

  • queue = 'celery_periodic' tùy chọn được sử dụng khi bạn gọi tác vụ từ mã (.delay hoặc .apply_async)

  • tùy chọn = {'queue': 'celery_periodic'} tùy chọn được sử dụng khi cần đánh bại gọi nó.

Tôi chắc chắn, điều tương tự cũng có thể xảy ra nếu bạn định cấu hình các tác vụ định kỳ với biến CELERYBEAT_SCHEDULE.

UPD. Giải pháp này đúng cho cả lưu trữ dựa trên DB và dựa trên tệp cho CELERYBEAT_SCHEDULER.

+0

@periodic_task (nếu tôi hiểu đúng) không được chấp nhận ngay bây giờ – StErMi

+0

@StErMi yep, chúng sẽ không hoạt động. – iankit

25

Định kỳ được gửi đến hàng đợi bởi celerybeat.Bạn có thể làm mọi việc chúng tôi làm với Celery api. Dưới đây là danh sách các cấu hình đi kèm với celerybeat.

http://celery.readthedocs.org/en/latest/userguide/periodic-tasks.html#available-fields

Trong trường hợp của bạn

CELERYBEAT_SCHEDULE = { 
    'installer_recalc_hour': { 
     'task': 'stats.installer.tasks.recalc_last_hour', 
     'schedule': 15 # every 15 sec for test, 
     'options': {'queue' : 'celery_periodic'} ##options are mapped to apply_async options 
    }, 
} 
+7

Đây có phải là câu trả lời được chấp nhận không? – Buttons840

+0

Vâng, cả hai trả lời câu hỏi theo một cách ... Tuy nhiên, tôi đồng ý rằng câu trả lời này là tốt hơn một chút so với chấp nhận bởi vì tác giả câu hỏi yêu cầu thay đổi CELERYBEAT_SCHEDULE ... – DejanLekic

2

Và nếu bạn đang sử dụng djcelery Cơ sở dữ liệu lịch trình, bạn có thể xác định hàng đợi trên Options Thi Công -> đợi lĩnh vực

Các vấn đề liên quan