Celery: рдореЙрдбреНрдпреВрд▓ рдиреЙрдЯрдлрд╛рдЙрдВрдб рдПрд░рд░: рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, Django рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 20 рдЬреБрд▓ре░ 2018  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: celery/celery

рдореИрдВ рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдкрд╣рд▓реЗ рд╕реЗ рдкрд╣рд▓реА рдмрд╛рд░ рдЕрдЬрд╡рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХрд╛рд░реНрдп рдХрддрд╛рд░ рдореЗрдВ рдХрд╛рдлреА рддрд╛рдЬрд╛ рд╣реВрдВред рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ Django рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдЬрд╡рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ ModuleNotFoundError рддреНрд░реБрдЯрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

рдореИрдВ Django 1.11 рдФрд░ celery 4.2.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореЗрд░реА рдлрд╛рдЗрд▓реЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:

Celery_tasks.py

from celery import Celery
from celery import task
import os

app = Celery('myapp')                         
#app.config_from_object('myapp.celeryconfig', namespace='CELERY')  # WORKS WHEN CALLED THROUGH VIEW/DJANGO: Tell Celery instance to use celeryconfig module
app.config_from_object('celeryconfig', namespace='CELERY')  # WORKS WHEN CALLED THROUGH TERMINAL

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

suf = lambda n: "%d%s" % (n, {1: "st", 2: "nd", 3: "rd"}.get(n if n < 20 else n % 10, "th"))
@app.task(name='celery_tasks.fav_doctor')
def fav_doctor():
    """Reads doctor.txt file and prints out fav doctor, then  addsa new
    number to the file"""

    with open('doctor.txt', 'r+') as f:
        for line in f:
            nums = line.rstrip().split()

            print ('The {} doctor is my favorite'.format(suf(int(nums[0]))))

            for num in nums[1:]:
                print ('Wait! The {} doctor is my favorite'.format(suf(int(num))))

            last_num = int(nums[-1])
            new_last_num = last_num + 1

            f.write(str(new_last_num) + ' ')


@app.task(name='celery_tasks.reverse')
def reverse(string):
    return string[::-1]

@app.task(name='celery_tasks.add')
def add(x, y):
    return x+y


if __name__ == '__main__':
    app.start()

рд╕реЗрд▓реЗрд░реАрдХреЙрдиреНрдлрд┐рдЧ.py

from __future__ import absolute_import, unicode_literals
from datetime import timedelta

## List of modules to import when celery starts.
CELERY_IMPORTS = ['celery_tasks',]

## Message Broker (RabbitMQ) settings.
BROKER_URL = 'amqp://'
BROKER_PORT = 5672

## Result store settings.
CELERY_RESULT_BACKEND = 'rpc://' 

## Worker settings
#CELERYD_CONCURRENCY = 1
#CELERYD_TASK_TIME_LIMIT = 20
#CELERYD_LOG_FILE = 'celeryd.log'
#CELERYD_LOG_LEVEL = 'INFO'

## Misc
#CELERY_IGNORE_RESULT = False
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT=['json']
CELERY_TIMEZONE = 'Europe/Berlin'
CELERY_ENABLE_UTC = True

CELERYBEAT_SCHEDULE = {
    'doctor-every-10-seconds': {
        'task': 'celery_tasks.fav_doctor',
        'schedule': timedelta(seconds=3),
    },
}

__init__.py

from .celery_tasks import app as celery_app # Ensures app is always imported when Django starts so that shared_task will use this app.

__all__ = ['celery_app']

-> myapp-- __init__.py--celery_tasks.py--celeryconfig.py-> рд╡рд┐рдЪрд╛рд░-- admin_scripts.py

рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЬрд╣рд╛рдВ рд╕реЗрд▓реЗрд░реА рдлрд╛рдЗрд▓реЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ, рдФрд░ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡реА рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдЯрд╛рдЗрдк рдХрд░реЗрдВ:

celery -A celery_tasks worker -l info

рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдореЗрд░реА Celery_tasks.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде:

#app.config_from_object('myapp.celeryconfig', namespace='CELERY')  # WORKS WHEN CALLED THROUGH VIEW/DJANGO: Tell Celery instance to use celeryconfig module
app.config_from_object('celeryconfig', namespace='CELERY')  # WORKS WHEN CALLED THROUGH TERMINAL

рдХреЛрдб рдХреА рдЙрдкрд░реЛрдХреНрдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреБрди: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА, рдХреНрдпрд╛ рдореИрдВ Django рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдЬрд╡рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП:

app.config_from_object('myapp.celeryconfig', namespace='CELERY')  # WORKS WHEN CALLED THROUGH VIEW/DJANGO: Tell Celery instance to use celeryconfig module
#app.config_from_object('celeryconfig', namespace='CELERY')  # WORKS WHEN CALLED THROUGH TERMINAL

рдЕрдЧрд░ рдореИрдВ рдпрд╣ рдХрджрдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рдЬреИрд╕реЗ рдХрд┐ рдмреАрдЪ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд┐рдП рдмрд┐рдирд╛,

app.config_from_object('myapp.celeryconfig', namespace='CELERY') # рд╡реНрдпреВ/DJANGO рдХреЗ рдЬрд░рд┐рдП рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рд╕реЗрд▓реЗрд░реА рдХреЙрдиреНрдлрд┐рдЧ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрд▓реЗрд░реА рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдмрддрд╛рдПрдВ

app.config_from_object('celeryconfig', namespace='CELERY') # рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рддрдм рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:

[20/Jul/2018 07:03:06] ERROR [django.request:135] Internal Server Error: /myapp/adminscripts/
Traceback (most recent call last):
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/local.py", line 317, in _get_current_object
    return object.__getattribute__(self, '__thing')
AttributeError: 'PromiseProxy' object has no attribute '__thing'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/kombu/utils/objects.py", line 42, in __get__
    return obj.__dict__[self.__name__]
KeyError: 'data'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/loaders/base.py", line 144, in _smart_import
    return imp(path)
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/loaders/base.py", line 98, in import_from_cwd
    package=package,
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/utils/imports.py", line 104, in import_from_cwd
    return imp(module, package=package)
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/loaders/base.py", line 92, in import_module
    return importlib.import_module(module, package=package)
  File "/Users/my_mbp/anaconda3/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 978, in _gcd_import
  File "<frozen importlib._bootstrap>", line 961, in _find_and_load
  File "<frozen importlib._bootstrap>", line 948, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'celeryconfig'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/Users/my_mbp/Software/myapp/myappsite/myapp/views/admin_scripts.py", line 56, in admin_script_dashboard
    async_result = add.delay(24, 54) # delay() invokes the Celery, responsible for running this task asynchronously
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/local.py", line 146, in __getattr__
    return getattr(self._get_current_object(), name)
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/local.py", line 319, in _get_current_object
    return self.__evaluate__()
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/local.py", line 349, in __evaluate__
    thing = Proxy._get_current_object(self)
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/local.py", line 109, in _get_current_object
    return loc(*self.__args, **self.__kwargs)
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/app/base.py", line 454, in _task_from_fun
    task.bind(self)  # connects task to this app
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/app/task.py", line 319, in bind
    setattr(cls, attr_name, conf[config_name])
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/utils/collections.py", line 429, in __getitem__
    return getitem(k)
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/utils/collections.py", line 278, in __getitem__
    return mapping[_key]
  File "/Users/my_mbp/anaconda3/lib/python3.6/collections/__init__.py", line 989, in __getitem__
    if key in self.data:
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/kombu/utils/objects.py", line 44, in __get__
    value = obj.__dict__[self.__name__] = self.__get(obj)
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/app/base.py", line 141, in data
    return self.callback()
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/app/base.py", line 924, in _finalize_pending_conf
    conf = self._conf = self._load_config()
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/app/base.py", line 934, in _load_config
    self.loader.config_from_object(self._config_source)
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/loaders/base.py", line 126, in config_from_object
    obj = self._smart_import(obj, imp=self.import_from_cwd)
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/loaders/base.py", line 147, in _smart_import
    return symbol_by_name(path, imp=imp)
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/kombu/utils/imports.py", line 56, in symbol_by_name
    module = imp(module_name, package=package, **kwargs)
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/loaders/base.py", line 98, in import_from_cwd
    package=package,
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/utils/imports.py", line 104, in import_from_cwd
    return imp(module, package=package)
  File "/Users/my_mbp/anaconda3/lib/python3.6/site-packages/celery/loaders/base.py", line 92, in import_module
    return importlib.import_module(module, package=package)
  File "/Users/my_mbp/anaconda3/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 978, in _gcd_import
  File "<frozen importlib._bootstrap>", line 961, in _find_and_load
  File "<frozen importlib._bootstrap>", line 948, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'celeryconfig'

рдореИрдВ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдХрд┐ рдореИрдВ рдХрд╣рд╛рдБ рдЧрд▓рдд рд╣реЛ рд░рд╣рд╛ рд╣реВрдБред рдореЗрд░реЗ рдореВрд▓ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ: рдореИрдВ рдПрдХ рдирдИ рд╡рд┐рдВрдбреЛ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдкреНрд░рд┐рдВрдЯ рдЖрдЙрдЯ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рдЧрддрд┐ рдкрдЯреНрдЯреА рдХреА рддрд░рд╣, рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рд╢рдд рдХреЗ рдмрдЬрд╛рдп, рдЖрдЙрдЯрдкреБрдЯ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдЖрдк рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред
рдзрдиреНрдпрд╡рд╛рджред

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реИ рдЕрдЬрд╡рд╛рдЗрди рдореЗрдВ рдирд╣реАрдВред

рдХреГрдкрдпрд╛ рдмреЗрдЭрд┐рдЭрдХ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХрд╣рд╛рдВ рд╣реИ?

@pymatffm рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛? рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

budlight picture budlight  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

croth1 picture croth1  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

keisetsu picture keisetsu  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

steinliber picture steinliber  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sklarsa picture sklarsa  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ