Celery Đã nhận nhiệm vụ chưa đăng ký của loại (ví dụ chạy)


96

Tôi đang cố gắng chạy ví dụ từ tài liệu Celery.

Tôi chạy: celeryd --loglevel=INFO

/usr/local/lib/python2.7/dist-packages/celery/loaders/default.py:64: NotConfigured: No 'celeryconfig' module found! Please make sure it exists and is available to Python.
  "is available to Python." % (configname, )))
[2012-03-19 04:26:34,899: WARNING/MainProcess]  

 -------------- celery@ubuntu v2.5.1
---- **** -----
--- * ***  * -- [Configuration]
-- * - **** ---   . broker:      amqp://guest@localhost:5672//
- ** ----------   . loader:      celery.loaders.default.Loader
- ** ----------   . logfile:     [stderr]@INFO
- ** ----------   . concurrency: 4
- ** ----------   . events:      OFF
- *** --- * ---   . beat:        OFF
-- ******* ----
--- ***** ----- [Queues]
 --------------   . celery:      exchange:celery (direct) binding:celery

task.py:

# -*- coding: utf-8 -*-
from celery.task import task

@task
def add(x, y):
    return x + y

run_task.py:

# -*- coding: utf-8 -*-
from tasks import add
result = add.delay(4, 4)
print (result)
print (result.ready())
print (result.get())

Trong cùng một thư mục celeryconfig.py:

CELERY_IMPORTS = ("tasks", )
CELERY_RESULT_BACKEND = "amqp"
BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_TASK_RESULT_EXPIRES = 300

Khi tôi chạy "run_task.py":

trên bảng điều khiển python

eb503f77-b5fc-44e2-ac0b-91ce6ddbf153
False

lỗi trên máy chủ celeryd

[2012-03-19 04:34:14,913: ERROR/MainProcess] Received unregistered task of type 'tasks.add'.
The message has been ignored and discarded.

Did you remember to import the module containing this task?
Or maybe you are using relative imports?
Please see http://bit.ly/gLye1c for more information.

The full contents of the message body was:
{'retries': 0, 'task': 'tasks.add', 'utc': False, 'args': (4, 4), 'expires': None, 'eta': None, 'kwargs': {}, 'id': '841bc21f-8124-436b-92f1-e3b62cafdfe7'}

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/celery/worker/consumer.py", line 444, in receive_message
    self.strategies[name](message, body, message.ack_log_error)
KeyError: 'tasks.add'

Vui lòng giải thích vấn đề là gì.


12
Xin chào, bạn có thể vui lòng chia sẻ vấn đề là gì và bạn đã giải quyết như thế nào? Câu trả lời được chấp nhận không làm rõ cách người khác có thể giải quyết vấn đề này. Cảm ơn.
Jordan Reiter

3
Tôi với Jordan - điều này không hữu ích chút nào. Bị phản đối.
Jay Taylor

2
câu trả lời của aiho là điều đúng:CELERY_IMPORTS = ("tasks", )
Alp

Câu trả lời:


49

Bạn có thể xem danh sách các nhiệm vụ đã đăng ký hiện tại trong celery.registry.TaskRegistrylớp. Có thể là celeryconfig của bạn (trong thư mục hiện tại) không có trong PYTHONPATHnên celery không thể tìm thấy nó và rơi trở lại mặc định. Chỉ cần chỉ định nó một cách rõ ràng khi bắt đầu sử dụng cần tây.

celeryd --loglevel=INFO --settings=celeryconfig

Bạn cũng có thể đặt --loglevel=DEBUGvà có thể bạn sẽ thấy vấn đề ngay lập tức.


4
+1 cho --loglevel=DEBUG, đã xảy ra lỗi cú pháp trong tác vụ của tôi.
Jacob Valenta

12
Cần tây đã lỗi thời. Bây giờ ta nên chạy celery workerví dụ như cho Djangonhư thế nàycelery --app=your_app.celery worker --loglevel=info
andilabs

Đối với tôi (celery 3.1.23), tôi phải sử dụng celery.registry.tasksđể xem danh sách tất cả các nhiệm vụ hiện tại của mình. Bạn luôn có thể kiểm tra bằng cách chạy dir(celery.registry).
Nick Brady

cho --loglevel=DEBUGtừ bên cạnh tôi cũng
Shobi

64

Tôi nghĩ bạn cần khởi động lại máy chủ công nhân. Tôi gặp vấn đề tương tự và giải quyết nó bằng cách khởi động lại.


8
Cảm ơn! Ước gì tôi tìm thấy thông tin này cách đây một giờ
Nexus

2
CÁi này đã sửa nó giúp tôi. Nếu bạn đang sử dụng các tập lệnh celeryd, thì worker sẽ nhập (các) mô-đun tác vụ của bạn khi khởi động. Ngay cả khi bạn sau đó tạo thêm các hàm tác vụ hoặc thay đổi các hàm hiện có, thì worker sẽ sử dụng các bản sao trong bộ nhớ của nó như khi nó đọc chúng.
Đánh dấu

1
Lưu ý: bạn có thể xác minh rằng các nhiệm vụ của mình đã được đăng ký hay chưa bằng cách chạycelery inspect registered
Nick Brady

1
Bạn cũng có thể khởi động cần tây với tùy chọn --autoreloadsẽ khởi động lại cần tây mỗi khi mã được thay đổi.
Sergey Lyapustin

Rất tiếc là không được dùng nữa. Người ta có thể sử dụng một giải pháp từ liên kết này: avilpage.com/2017/05/…
Tomasz Szkudlarek

50

Tôi đã gặp vấn đề tương tự: Lý do "Received unregistered task of type.."là dịch vụ celeryd không tìm thấy và đăng ký các tác vụ khi bắt đầu dịch vụ (btw danh sách của chúng hiển thị khi bạn bắt đầu ./manage.py celeryd --loglevel=info).

Các tác vụ này phải được khai báo trong CELERY_IMPORTS = ("tasks", )tệp cài đặt.
Nếu bạn có một celery_settings.pytệp đặc biệt, nó phải được khai báo trên dịch vụ celeryd, hãy bắt đầu --settings=celery_settings.pynhư digivampire đã viết.


1
Cảm ơn, tôi thực sự đã gặp sự cố vì tôi đã bắt đầu cần tây bằng ~ / path / to / celery / celeryd thay vì sử dụng lệnh management.py!
Antoine

27

Cho dù bạn sử dụng CELERY_IMPORTShay autodiscover_tasks, điểm quan trọng là các nhiệm vụ có thể được tìm thấy và tên của các nhiệm vụ được đăng ký trong Celery phải khớp với tên mà nhân viên cố gắng tìm nạp.

Khi bạn khởi chạy Celery, chẳng hạn celery worker -A project --loglevel=DEBUG, bạn sẽ thấy tên của nhiệm vụ. Ví dụ, nếu tôi có một debug_tasknhiệm vụ trong của tôi celery.py.

[tasks]
. project.celery.debug_task
. celery.backend_cleanup
. celery.chain
. celery.chord
. celery.chord_unlock
. celery.chunks
. celery.group
. celery.map
. celery.starmap

Nếu bạn không thể nhìn thấy nhiệm vụ của bạn trong danh sách, xin vui lòng kiểm tra cấu hình nhập khẩu cần tây bạn các nhiệm vụ một cách chính xác, hoặc trong --setting, --config, celeryconfighoặc config_from_object.

Nếu bạn đang sử dụng cần tây beat, hãy đảm bảo rằng tên tác vụ taskmà bạn sử dụng CELERYBEAT_SCHEDULEkhớp với tên trong danh sách tác vụ cần tây.


Điều này rất hữu ích. Tên của ứng nhu cầu nhiệm vụ để phù hợp với các 'nhiệm vụ' quan trọng trong CELERYBEAT_SCHEDULE của bạn
ss_millionaire

* Điểm quan trọng là các nhiệm vụ có thể được tìm thấy và tên của các nhiệm vụ được đăng ký trong Celery phải khớp với tên mà các nhân viên cố gắng tìm nạp. * Điểm tốt!!!
Light.G

Đây là câu trả lời chính xác. Tên công việc của bạn trong BEAT_SCHEDULER phải khớp với bất kỳ tên nào hiển thị trên danh sách các công việc được tự động phát hiện. Vì vậy, nếu bạn sử dụng @task(name='check_periodically')sau đó nó phải phù hợp với những gì bạn đưa vào lịch trình nhịp, IE:CELERY_BEAT_SCHEDULE = { 'check_periodically': { 'task': 'check_periodically', 'schedule': timedelta(seconds=1) }
Mormoran

16

Tôi cũng có cùng một vấn đề; Tôi đã thêm

CELERY_IMPORTS=("mytasks")

trong celeryconfig.pyhồ sơ của tôi để giải quyết nó.


6
Lưu ý rằng đây phải là một danh sách hoặc một bộ:CELERY_IMPORTS = ['my_module']
askol

Điều này đã làm điều đó cho tôi
Riziero

12
app = Celery('proj',
             broker='amqp://',
             backend='amqp://',
             include=['proj.tasks'])

vui lòng bao gồm = ['proj.tasks'] Bạn cần truy cập dir hàng đầu, sau đó thực hiện điều này

celery -A app.celery_module.celeryapp worker --loglevel=info

không phải

celery -A celeryapp worker --loglevel=info

trong celeryconfig.py input import = ("path.ptah.tasks",)

xin vui lòng trong mô-đun khác gọi nhiệm vụ !!!!!!!!


1
Các includenhu cầu param là add nếu bạn đang sử dụng nhập khẩu tương đối. Tôi đã giải quyết vấn đề của mình bằng cách thêm nó
CK.Nguyen 28/09/18

1
Đã bình chọn câu trả lời của bạn cho chuỗi này please in other module invoke task!!!!!!!!. Nó đã giúp đỡ.
VolArt

8

Tôi không sử dụng --settings. Tôi đã phải sử dụng những thứ sau để làm cho tất cả hoạt động:

celery --config=celeryconfig --loglevel=INFO

Đây là tệp celeryconfig đã thêm CELERY_IMPORTS:

# Celery configuration file
BROKER_URL = 'amqp://'
CELERY_RESULT_BACKEND = 'amqp://'

CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'America/Los_Angeles'
CELERY_ENABLE_UTC = True

CELERY_IMPORTS = ("tasks",)

Việc thiết lập của tôi phức tạp hơn một chút vì tôi đang sử dụng trình giám sát để khởi chạy cần tây dưới dạng daemon.


8

Đối với tôi, lỗi này đã được giải quyết bằng cách đảm bảo ứng dụng chứa các tác vụ được đưa vào cài đặt INSTALLED_APPS của django.


Ngoài ra, các tác vụ cần thiết để có thể truy cập từ <app> /tasks.py
np8

3

Tôi đã gặp sự cố này một cách bí ẩn khi tôi thêm một số xử lý tín hiệu vào ứng dụng django của mình. Khi làm như vậy, tôi đã chuyển đổi ứng dụng sang sử dụng AppConfig, nghĩa là thay vì chỉ đọc là 'booking'trong INSTALLED_APPS, nó sẽ đọc 'booking.app.BookingConfig'.

Celery không hiểu điều đó có nghĩa là gì, vì vậy tôi đã thêm, INSTALLED_APPS_WITH_APPCONFIGS = ('booking',)vào cài đặt django của mình và sửa đổi celery.pytừ

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

đến

app.autodiscover_tasks(
    lambda: settings.INSTALLED_APPS + settings.INSTALLED_APPS_WITH_APPCONFIGS
)

3

Điều làm việc hiệu quả với tôi là thêm tên rõ ràng vào trình trang trí nhiệm vụ cần tây. Tôi đã thay đổi khai báo nhiệm vụ của mình từ @app.tasksthành@app.tasks(name='module.submodule.task')

Đây là một ví dụ

# test_task.py
@celery.task
def test_task():
    print("Celery Task  !!!!")

# test_task.py
@celery.task(name='tasks.test.test_task')
def test_task():
    print("Celery Task  !!!!")

2

Tôi gặp sự cố tương tự khi chạy các tác vụ từ Celery Beat. Cần tây không thích nhập khẩu tương đối nên trong của tôi celeryconfig.py, tôi phải đặt tên gói đầy đủ rõ ràng:

app.conf.beat_schedule = {
   'add-every-30-seconds': {
        'task': 'full.path.to.add',
        'schedule': 30.0,
        'args': (16, 16)
    },
}

Tôi ước các tài liệu về cần tây có nhiều ví dụ hơn với tên gói đầy đủ. Sau khi xem full.path.to.add trong câu trả lời này, tôi phát hiện ra rằng mình không cần nhập. Tôi biết giải pháp rất đơn giản và chỉ cần có một ví dụ tốt hơn về app.conf.beat_schedule.
zerocog

2

Điều này, kỳ lạ thay, cũng có thể là do một gói bị thiếu. Chạy pip để cài đặt tất cả các gói cần thiết: pip install -r requirements.txt

autodiscover_tasks không chọn các tác vụ đã sử dụng các gói bị thiếu.


1
Tôi đã có một vấn đề tương tự. Tôi nghĩ rằng những gì xảy ra là một ngoại lệ trong quá trình nhập khiến các bộ phận của tính năng tự động phát hiện không hoàn thành.
Tim Tisdall

À vâng, có lý. Cảm ơn
kakoma

1

Tôi không có bất kỳ vấn đề với Django . Nhưng gặp phải điều này khi tôi đang sử dụng Flask . Giải pháp là thiết lập tùy chọn cấu hình.

celery worker -A app.celery --loglevel=DEBUG --config=settings

trong khi với Django, tôi chỉ có:

python manage.py celery worker -c 2 --loglevel=info


1

Tôi cũng gặp phải vấn đề này, nhưng nó không hoàn toàn giống nhau, vì vậy chỉ FYI. Các nâng cấp gần đây gây ra thông báo lỗi này do cú pháp trang trí này.

ERROR/MainProcess] Received unregistered task of type 'my_server_check'.

@task('my_server_check')

Phải thay đổi để chỉ

@task()

Không có manh mối tại sao.


1

Nếu bạn đang sử dụng cấu hình ứng dụng trong các ứng dụng đã cài đặt như sau:

LOCAL_APPS = [
'apps.myapp.apps.MyAppConfig']

Sau đó, trong ứng dụng cấu hình của bạn, hãy nhập tác vụ ở phương pháp sẵn sàng như sau:

from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name = 'apps.myapp'

    def ready(self):
        try:
            import apps.myapp.signals  # noqa F401
            import apps.myapp.tasks
        except ImportError:
            pass

0

Nếu bạn gặp phải lỗi này, có một số nguyên nhân có thể xảy ra nhưng giải pháp mà tôi tìm thấy là tệp cấu hình celeryd của tôi trong / etc / defaults / celeryd được định cấu hình để sử dụng tiêu chuẩn, không phải cho dự án django cụ thể của tôi. Ngay sau khi tôi chuyển đổi nó sang định dạng được chỉ định trong tài liệu cần tây , tất cả đều ổn.


0

Giải pháp để tôi thêm dòng này vào / etc / default / celeryd

CELERYD_OPTS="-A tasks"

Bởi vì khi tôi chạy các lệnh này:

celery worker --loglevel=INFO
celery worker -A tasks --loglevel=INFO

Chỉ có lệnh sau là hiển thị tên nhiệm vụ.

Tôi cũng đã thử thêm dòng CELERY_APP / etc / default / celeryd nhưng điều đó cũng không hoạt động.

CELERY_APP="tasks"

0

Tôi đã gặp sự cố với các lớp PeriodicTask trong django-celery, trong khi tên của chúng hiển thị tốt khi bắt đầu công nhân cần tây mỗi lần thực thi được kích hoạt:

KeyError: u'my_app.tasks.run '

Nhiệm vụ của tôi là một lớp có tên 'CleanUp', không chỉ là một phương thức được gọi là 'chạy'.

Khi tôi kiểm tra bảng 'djcelery_periodictask', tôi thấy các mục nhập đã lỗi thời và việc xóa chúng đã khắc phục sự cố.


0

Chỉ để thêm hai xu cho trường hợp của tôi với lỗi này ...

Con đường của tôi là /vagrant/devops/testvới app.py__init__.pytrong đó.

Khi tôi chạy, cd /vagrant/devops/ && celery worker -A test.app.celery --loglevel=infotôi gặp lỗi này.

Nhưng khi tôi chạy nó như cd /vagrant/devops/test && celery worker -A app.celery --loglevel=infomọi thứ đều ổn.


0

Tôi nhận thấy rằng một trong những lập trình viên của chúng tôi đã thêm dòng sau vào một trong các lần nhập:

os.chdir(<path_to_a_local_folder>)

Điều này khiến Celery worker thay đổi thư mục làm việc của nó từ thư mục làm việc mặc định của dự án (nơi nó có thể tìm thấy các tác vụ) sang một thư mục khác (nơi nó không thể tìm thấy các tác vụ).

Sau khi loại bỏ dòng mã này, tất cả các nhiệm vụ đã được tìm thấy và đăng ký.


0

Cần tây không hỗ trợ nhập khẩu tương đối vì vậy trong celeryconfig.py của tôi, bạn cần nhập khẩu tuyệt đối.

CELERYBEAT_SCHEDULE = {
        'add_num': {
            'task': 'app.tasks.add_num.add_nums',
            'schedule': timedelta(seconds=10),
            'args': (1, 2)
        }
}

0

Một mục bổ sung vào danh sách thực sự hữu ích.

Tôi thấy Celery không khoan nhượng liên quan đến lỗi trong nhiệm vụ (hoặc ít nhất là tôi không thể theo dõi các mục nhập nhật ký thích hợp) và nó không đăng ký chúng. Tôi đã gặp một số vấn đề khi chạy Celery như một dịch vụ, chủ yếu liên quan đến quyền.

Mới nhất liên quan đến quyền ghi vào tệp nhật ký. Tôi không gặp vấn đề gì khi phát triển hoặc chạy cần tây ở dòng lệnh, nhưng dịch vụ đã báo cáo tác vụ là chưa được đăng ký.

Tôi cần thay đổi quyền của thư mục nhật ký để cho phép dịch vụ ghi vào nó.


0

2 xu của tôi

Tôi đã nhận được điều này trong một hình ảnh docker bằng cách sử dụng alpine. Cài đặt django được tham chiếu /dev/logđể ghi vào nhật ký hệ thống. Ứng dụng django và công nhân cần tây đều dựa trên cùng một hình ảnh. Điểm vào của hình ảnh ứng dụng django đã khởi chạy syslogdkhi bắt đầu, nhưng điểm cho nhân viên cần tây thì không. Điều này gây ra mọi thứ như ./manage.py shellthất bại vì sẽ không có bất kỳ điều gì /dev/log. Công nhân cần tây đã không thất bại. Thay vào đó, nó đã âm thầm bỏ qua phần còn lại của lần khởi chạy ứng dụng, bao gồm tải shared_taskcác mục nhập từ các ứng dụng trong dự án django


0

Trong trường hợp của tôi, lỗi là do một vùng chứa đã tạo tệp trong thư mục được gắn trên hệ thống tệp máy chủ với docker-comp.

Tôi chỉ cần xóa các tệp được tạo bởi vùng chứa trên hệ thống máy chủ và tôi đã có thể khởi chạy lại dự án của mình.

tên thư mục sudo rm -Rf

(Tôi phải sử dụng sudo vì các tệp được sở hữu bởi người dùng root)

Phiên bản Docker: 18.03.1


0

Nếu bạn sử dụng autodiscover_tasks, hãy đảm bảo rằng bạn functionssẽ đăng ký ở trong tasks.pytệp, không phải bất kỳ tệp nào khác. Hoặc cần tây không thể tìm thấy functionsbạn muốn đăng ký.

Sử dụng app.register_taskcũng sẽ thực hiện công việc, nhưng có vẻ hơi ngây thơ.

Vui lòng tham khảo thông số kỹ thuật chính thức của autodiscover_tasks.

def autodiscover_tasks(self, packages=None, related_name='tasks', force=False):
    """Auto-discover task modules.

    Searches a list of packages for a "tasks.py" module (or use
    related_name argument).

    If the name is empty, this will be delegated to fix-ups (e.g., Django).

    For example if you have a directory layout like this:

    .. code-block:: text

        foo/__init__.py
           tasks.py
           models.py

        bar/__init__.py
            tasks.py
            models.py

        baz/__init__.py
            models.py

    Then calling ``app.autodiscover_tasks(['foo', bar', 'baz'])`` will
    result in the modules ``foo.tasks`` and ``bar.tasks`` being imported.

    Arguments:
        packages (List[str]): List of packages to search.
            This argument may also be a callable, in which case the
            value returned is used (for lazy evaluation).
        related_name (str): The name of the module to find.  Defaults
            to "tasks": meaning "look for 'module.tasks' for every
            module in ``packages``."
        force (bool): By default this call is lazy so that the actual
            auto-discovery won't happen until an application imports
            the default modules.  Forcing will cause the auto-discovery
            to happen immediately.
    """

0

Viết đường dẫn chính xác đến các tác vụ tệp

app.conf.beat_schedule = {
'send-task': {
    'task': 'appdir.tasks.testapp',
    'schedule': crontab(minute='*/5'),  
},

}


0

khi chạy cần tây với lệnh "celery -A conf worker -l info", tất cả các tác vụ được liệt kê trong nhật ký giống như tôi đang gặp phải. conf.celery.debug_task Tôi gặp lỗi vì tôi không đưa ra đường dẫn tác vụ chính xác này. Vì vậy, vui lòng kiểm tra lại điều này bằng cách sao chép và dán id nhiệm vụ chính xác.


0
app = Celery(__name__, broker=app.config['CELERY_BROKER'], 
backend=app.config['CELERY_BACKEND'], include=['util.xxxx', 'util.yyyy'])

0

Câu trả lời cho vấn đề dối trá của bạn trong lần đầu tiên dòng đầu ra mà bạn cung cấp trong câu hỏi của bạn: /usr/local/lib/python2.7/dist-packages/celery/loaders/default.py:64: NotConfigured: No 'celeryconfig' module found! Please make sure it exists and is available to Python. "is available to Python." % (configname, ))). Nếu không có cấu hình phù hợp Cần tây không thể làm được bất cứ điều gì.

Lý do tại sao nó không thể tìm thấy celeryconfig rất có thể nó không có trong PYTHONPATH của bạn.


0

Tôi đã giải quyết được vấn đề của mình, 'nhiệm vụ' của tôi nằm trong một gói python có tên 'celery_task' , khi tôi thoát gói này và chạy lệnh celery worker -A celery_task.task --loglevel=info. Nó hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.