2012-03-03 30 views
11

Tôi hy vọng sẽ có thể tạo ra các mục cần thiết theo lập trình và đồng bộ hóa celerybeat khi các mục được thêm vào. Tài liệu here trạng tháiLàm thế nào để lập trình tạo ra các mục cần thiết với cần tây và Django

By default the entries are taken from the CELERYBEAT_SCHEDULE setting, but custom stores can also be used, like storing the entries in an SQL database.

Vì vậy, tôi đang cố gắng tìm ra những lớp tôi cần mở rộng để có thể thực hiện việc này.

Tôi đã xem celery scheduler docsdjcelery api docs nhưng tài liệu về những gì một trong những phương pháp này không tồn tại để đi sâu vào một số nguồn và hy vọng ai đó có thể chỉ cho tôi đúng hướng.

Tôi đoán mức độ cao của những gì tôi đang làm sẽ hữu ích ... Là người dùng tôi cần để có thể chọn từ tập hợp được xác định trước và cung cấp cách để người dùng chọn một số loại tùy chỉnh lịch trình để thực thi, như mỗi ngày/tuần/tháng và ngày và giờ.

Đây cũng là ở Django với djcelery.

CẬP NHẬT

Tôi thấy đoạn mã cho các admin djcelery nhưng không rõ ràng về cách dữ liệu đang được tồn. Tôi hiện đang có một generic addTask nhìn trông như thế này:

def addTask(request): 

intervalSchedule = IntervalSchedule.from_schedule(schedule(timedelta(seconds=10))) 
intervalSchedule.save() 
modelData = dict(
    name="dcTestPersist", 
    task="technologytrackerapi.views.createRecord", 
    schedule=intervalSchedule, 
) 
periodicTask = PeriodicTask(**modelData) 
periodicTask.save() 
return render_to_response('taskView.html') 

Các dữ liệu có vẻ đúng trong db nhưng khi daemon chạy nó có lỗi này:

[2012-03-06 00:23:07,926: WARNING/Beat] Process Beat:
[2012-03-06 00:23:07,926: WARNING/Beat] Traceback (most recent call last):
[2012-03-06 00:23:07,926: WARNING/Beat] File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
[2012-03-06 00:23:07,926: WARNING/Beat] self.run()
[2012-03-06 00:23:07,927: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", line 464, in run
[2012-03-06 00:23:07,927: WARNING/Beat] self.service.start(embedded_process=True)
[2012-03-06 00:23:07,927: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev /.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", line 403, in start
[2012-03-06 00:23:07,927: WARNING/Beat] interval = self.scheduler.tick()
[2012-03-06 00:23:07,927: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", line 194, in tick
[2012-03-06 00:23:07,927: WARNING/Beat] next_time_to_run = self.maybe_due(entry, self.publisher)
[2012-03-06 00:23:07,927: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", line 170, in maybe_due
[2012-03-06 00:23:07,927: WARNING/Beat] is_due, next_time_to_run = entry.is_due()
[2012-03-06 00:23:07,928: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/djcelery/schedulers.py", line 54, in is_due
[2012-03-06 00:23:07,928: WARNING/Beat] return self.schedule.is_due(self.last_run_at)
[2012-03-06 00:23:07,928: WARNING/Beat] AttributeError: 'NoneType' object has no attribute 'is_due'

Tôi không chắc chắn lý do tại sao tôi lịch biểu không sử dụng mặc định is_due()

Trả lời

6

Đây là những gì đã kết thúc làm việc cho tôi:

def addTask(request): 

    intervalSchedule = IntervalSchedule.from_schedule(schedule(timedelta(seconds=10))) 
    intervalSchedule.save() 

    modelData = dict(
     name="dcTestPersist", 
     task="technologytrackerapi.tasks.createRecord", 
     interval_id=intervalSchedule.pk, 
) 

    periodicTask = PeriodicTask(**modelData) 
    periodicTask.save() 

    me = ModelEntry(periodicTask) 

    try: 
     me.save() 

    except: 
    from django.db import connection 
    print connection.queries 
    raise 

    return render_to_response('taskView.html') 

tôi phải quấn Task kỳ trong một ModelEntry.

+0

Vì một lý do nào đó, tôi không hiểu tôi đã thực hiện tác vụ đã lập lịch của mình và không cần phải bọc với 'ModelEntry'. Không biết tại sao hay 'ModelEntry' là gì. Ghi chú ngẫu nhiên - Tôi cũng đã thiết lập 'hết hạn' và bị lúng túng rằng nó không có hiệu lực. Nó * có * có hiệu ứng, nhưng trên 'celeryd' không phải là 'celerybeat' -' celerybeat' tiếp tục kích hoạt vô thời hạn, nhưng sau khi 'expires'' celeryd' bỏ qua nó (trạng thái' bị thu hồi'). – Chris

+0

Đó là một phần của djcelery đó là một hội nhập với django. Không chắc chắn nếu bạn đang sử dụng đó. https://github.com/celery/django-celery Tôi sẽ nghi ngờ điều đó. Có vẻ không được chấp nhận. Đây là 4 tuổi. – Dustin

+0

@ Dustin xin lỗi không phải là quá nhiều yêu cầu như làm một lưu ý cho những người khác có thể đi cùng sau đó. Câu trả lời của bạn là ví dụ đơn giản nhất về lập lịch một PeriodicTask cho CeleryBeat lập trình trên internet! Phần còn lại sử dụng tệp cấu hình hoặc chỉ cung cấp một phần câu trả lời. (Tôi đang sử dụng djcelery - Tôi nghĩ đó là nơi mà cơ sở dữ liệu back-end đến từ, và tôi 'từ djcelery.models import *'.) – Chris

1

Tôi nghĩ rằng những gì bạn muốn làm là thêm PeriodicTask s vào cơ sở dữ liệu. Có vẻ như phần dưới cùng của https://github.com/ask/django-celery/blob/master/djcelery/admin.py là cách họ thêm vào các tác vụ trong quản trị viên - bạn sẽ cần phải cung cấp nội dung tương tự ở giao diện người dùng.

+0

phải chuyển sang câu trả lời ... – Dustin

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