Сельдерей выполняет задачу после вызова task.delay () 3-5 раз - PullRequest
0 голосов
/ 27 декабря 2018

Я использую сельдерей в проекте Django.Я пытался использовать rabbitmq и Redis Backend, но ни один не работает.Используемая версия сельдерея - 3.1.26.post2.Мне нужно вызвать 2, 3, иногда 5 раз, task.delay (), чтобы увидеть выполнение задачи.И иногда, как правило, после частого вызова одной и той же задачи ее «скорость выполнения» увеличивается и выполняется в 70–80% случаев.Например, он отбрасывает 1 или 2 из 5 вызовов task.delay (), но выполняет 3-4 из них.Вы испытали что-то подобное?В чем может быть причина?

1 Ответ

0 голосов
/ 28 декабря 2018

ОК, исходя из вашего описания, есть несколько битов, которые я не знаю (и они помогут):

  • как вы начинаете своих работников (то есть celery worker -A your_package_name)
  • Вы уверены, что подписываетесь на того же брокера, с которым позже свяжетесь с rabbitmqctl

На основании ваших отзывов, я полагаю, что ваши задачи либо выполняются очень долго, либо каким-то странным образом зависают и никогдаКонец.Они определенно попадают в очередь по умолчанию, созданную рабочим сельдерея при запуске (называемую celery).

Публикация кода примера задачи, которую вы пытаетесь вставить в очередь, а также пример кода того, как вы пытаетесь вставить его вОчередь тоже помогла бы.

Обычно я определяю свою задачу следующим образом (в моем пакете, который определяет, какие задачи должны выполняться, этот код будет выполняться рабочим из сельдерея):

from your_package_name.celery import app
@app.task
my_task_name(my_param):
    #do something here!
    return True

Я бы вставил свою задачу в очередь следующим образом (т.е. из оболочки python или из моего другого пакета, который должен вставлять задачи в очередь):

my_task_name.apply_async(
    args=(my_param,),
    queue='my_queue_name',)

Где-то в your_package_name есть немногокода, в котором вы определяете своего брокера (в моем случае я сохраняю его в celeryconfig.py, но это зависит от вас)

BROKER_URL = 'amqp://your_user_name:very_secret_pwd@localhost:5672/your_vhost'

Не путайте vhost с вашим именем хоста.

Если вы, как и я, используете rabbitmq, то вам нужно создать vhost, пользователя и пароль, прежде чем пытаться использовать брокер (запустите ниже в bash от имени root)

sudo -u rabbitmq -n rabbitmqctl add_user your_user_name very_secret_pwd
sudo -u rabbitmq -n rabbitmqctl add_vhost your_vhost
sudo -u rabbitmq -n rabbitmqctl set_user_tags your_user_name your_example_tag
sudo -u rabbitmq -n rabbitmqctl set_permissions -p your_vhost your_user_name ".*" ".*" ".*"

Я бы начал свой рабочий, как этот:

python -m celery worker -A your_package_name -Q my_queue_name -c 1 -f /tmp/celery.log --loglevel="INFO"

А затем я посмотрел бы журналы сельдерея в пределах /tmp/celery.log и также перечислил свои очереди следующим образом (в bash от имени root):

rabbitmqctl list_queues -p your_vhost

Надеюсь, это поможет вам справитьсядорожки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...