2017-03-05 8 views
0

here에있는 자습서를 따라 내 django 프로젝트에서 정의 된 주기적 작업을 얻고 있습니다. 작동Django-Celery : 다른 앱에서 프로젝트의 celery.py 파일로 가져 오기

from celery import Celery 
    from celery.schedules import crontab 

    app = Celery() 

    @app.on_after_configure.connect 
    def setup_periodic_tasks(sender, **kwargs): 
      # Calls test('hello') every 10 seconds. 
      sender.add_periodic_task(10.0, my_task.s('hello'), name='add every 10') 
      ) 

    @app.task 
    def my_task(arg): 
      print(arg) 

:

기사는 형태의 celery.py 파일을 가지고 제안합니다. 이제는 좋지만 로컬로 작업을 정의하고 싶지는 않습니다. 내 질문은, 어떻게 다른 애플 리케이션에서 작업을 추가 할 수 있습니까?

my_proj이라는 빈 프로젝트를 만들었으며 my_projapp_with_tasks의 두 가지 응용 프로그램이 있습니다. 위의 파일 celery.py은 루트 디렉토리의 my_proj 디렉토리에 있으며 app_with_taskstasks.py 파일의 정기 작업을 추가하고 싶습니다.

my_proj 설정 파일의 경우 Installed-apps에 app_with_tasks이 나열되어 있지만 앱에서 아무것도 가져올 수 없습니다.

나의 이해는 내가 사용한다는 것입니다 :

from app_with_tasks.tasks import task1 

하지만 my_proj 다음 PyCharm 같이 해결되지 않은 참조가 표시됩니다.

+0

셀러리 서버/데몬을 시작하는 데 사용하는 명령은 무엇입니까? – jperelli

+0

'셀러리 -A my_proj 이길 ',하지만 나는 아직 거기에 없다. 나는 app_with_tasks 앱으로부터 아무 것도 가져올 수없는 프로젝트 파일에 아무 것도없는 사소한 단계를 놓쳤다 고 생각한다. – ShS

답변

1

내가 사용하는 것을 알려 드리겠습니다. 아마 (셀러리 서버를 시작 태스크 변경이 때마다 다시 시작 파일 tasks.py에게

from my_proj.celery import app 
from django.apps import apps 

@app.task(bind=False) 
def your_task(some_arg): 
    A_Model = apps.get_model('my_proj', 'A_Model') 
    .... 

명령을 추가, app_with_tasks에

import os 
import celery 

# set the default Django settings module for the 'celery' program. 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_proj.settings') 

app = celery.Celery('app_django') 

app.config_from_object('django.conf.settings') 
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 

당신에게

my_proj/celery.py을하는 데 도움이 tasks.py 파일을 다시로드하는 방법)

/path/to/virtualenv/bin/celery --app=my_proj.celery:app --loglevel=INFO --concurrency=4 -n default_worker worker 

여기에 작업을 호출하려면 add_perio dic_task 코드)

from app_with_tasks.tasks import your_task 
your_task.apply_async(args=[123], kwargs=None) 
+0

감사합니다. 그래서 저는 Pycharm의 경고를 무시하고 어쨌든 셀러리를 때려 눕히고 이상하게도 실제로 이전처럼 이길 것이라고 생각했습니다. 그래서 문제는 실제로 물건의 셀러리가 아니라고 생각합니다. 파이컴 (Pycharm)은 어떤 이유에서든 자신의 존재를 인정하지 않습니다. – ShS

+0

중요한 것은'--app = my_proj.celery : app'와'autodiscover_tasks'라고 생각합니다. pycharms에게'my_proj.celery : app'을 사용하도록 지시해야합니다. http://stackoverflow.com/questions/37150910/how-can-i-use-pycharm-to-locally-debug-a-celery-worker를 참조하십시오. – jperelli

+0

실제로 바인딩 할 필요가 없음을 의미하는 @shared_tasks를 사용하고 있습니다. 애플 리케이션 인스턴스 (구글)에 내 작업 내가 말했듯이, 내 문제는 정말 같은 작업으로되지 않습니다. IDE는'app_with_tasks'를 인식하지 못합니다! – ShS